给出n个节点,满足同层节点的子节点个数相同的树有都少种不同的形态。
n<=1000
n<=1000
F[i]表示 有i个节点的满足要求的方案数,显然F[i]= sum{F[j] | (i-1)%j==0} 表示选出若干棵节点为j的树,给他们找一个公共的根,就是节点个数为i
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
const int MOD = (int)round(1e9+7);
const int maxn= 1000+10;
int F[maxn];
int n,m;
int main()
{
F[1] = 1;
for (int i = 2; i <= 1000;++i)
for (int j = 1; j < i ;++j)
if ((i-1)%j==0)
{
F[i]+=F[j];
if (F[i]>=MOD) F[i]-=MOD;
}
int Test = 0;
while (scanf("%d",&n)==1)
{
printf("Case %d: %d\n",++Test,F[n]);
}
return 0;
}
from:http://blog.youkuaiyun.com/kqzxcmh/article/details/8253155