给个题目链接: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;
}