我们把根节点去掉,得到m棵子树,这些子树的形状一定是相同的,
而且节点数也一定相同,
因此我们考虑 把(n-1)个节点分成m份,F[N]+=F((N-1)/M),
而且节点数也一定相同,
因此我们考虑 把(n-1)个节点分成m份,F[N]+=F((N-1)/M),
因为要平均分,所以M是N-1的约数
有一颗又n个节点的树形态不固定。我们对它的形态只有一个要求,那就是同一层的节点所跟的孩子的数目相同,问这个数有多少种形态,结果对1000000007取模
Input
每行输入一个数n(1<=n<=1000)
Output
输出结果mod1000000007
Sample Input
1
2
3
40
50
600
700
Sample Output
1
1
2
924
1998
315478277
825219749
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int f[1005];
int a[1005];
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 ans()
{
//memset(f,0,sizeof(f));
f[1]=1;
for(int i=2;i<1005;i++)
{
init(i-1);
for(int j=0;j<cnt;j++)
f[i]=(f[i]+f[(i-1)/a[j]])%1000000007;
}
}
int main()
{
int n;
ans();
while(~scanf("%d",&n))
{
printf("%d\n",f[n]);
}
return 0;
}