标签:blog http io ar os sp for on 2014
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4472
题目大意:
给你n个节点的一个树,第一层只有一个节点,然后剩下的同一层的节点的孩子数要相同,问这个数有多少种结构
分析:
我们把根节点去掉,得到m棵子树,这些子树的形状一定是相同的,而且节点数也一定相同,
因此我们考虑 把(n-1)个节点分成m份,F[N]+=F((N-1)/M),因为要平均分,所以M是N-1的约数
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int mod = 1000000007;
const int maxn = 1010;
LL f[maxn];
int a[maxn];
int cnt;
void init(int n)
{
cnt=0;
memset(a,0,sizeof(a));
for(int i=1;i*i<=n;i++){
if(n%i==0){
a[cnt++]=i;
if(i*i!=n)
a[cnt++]=n/i;
}
}
}
void solve()
{
memset(f,0,sizeof(f));
f[1]=1;
for(int i=2;i<=1001;i++){
init(i-1);
for(int j=0;j<cnt;j++)
f[i]=(f[i]+f[(i-1)/a[j]])%mod;
}
}
int main()
{
int n,cas=1;
solve();
while(~scanf("%d",&n)){
printf("Case %d: %d\n",cas++,f[n]);
}
return 0;
}
标签:blog http io ar os sp for on 2014
原文地址:http://blog.csdn.net/bigbigship/article/details/41647169