给个题目链接:https://vjudge.net/problem/UVA-1645
题目大意是求有多少个n个节点的每一层节点都有相同数量儿子的树,将答案对10^9+7取模,多组询问。
可以很简单的发现下一层的节点数肯定是上一层的倍数,这样的话我们就调和级数一下,N^2 log N预处理 O(1)查询。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #define ll long long const int maxn=1005; const int ha=1000000007; using namespace std; int f[maxn][maxn]; int ans[maxn],n,m; inline int add(int x,int y){ x+=y; if(x>=ha) return x-ha; else return x; } inline void init(){ f[1][1]=1; for(int i=1;i<=1000;i++) for(int j=1;j<=i;j++) if(f[i][j]){ int base=f[i][j]; ans[i]=add(ans[i],base); if(i<1000) for(int k=j,u=k+i;u<=1000;k+=j,u+=j) f[u][k]=add(f[u][k],base); } } int main(){ init(); int cnt=0; while(scanf("%d",&n)==1){ printf("Case %d: %d\n",++cnt,ans[n]); } return 0; }