题意:给定n个结点,构造一类树,这些树满足: 每一层的每个结点的子节点数相同。(即每一层的子树一模一样)。求树的个数。
设dp[n]为答案。
由于每一层的子树一模一样,假设这个子树的结点是J,那么 要满足条件, 就要使得 n-1是J的倍数(即,可以等分成 (n-1)/J个 子树), 而一个子树的数目是dp[j],
所以dp[i]+=dp[j],找到所有符合的J然后加起来就够了。。。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[1005]={0,1,1,2};
int main()
{
for(int i=4;i<=1000;i++)
{
for(int j=1;j<i;j++)
{
if((i-1)%j==0)
{
dp[i]=(dp[j]+dp[i])%1000000007;
}
}
}
int cas=1;
int n;
while(~scanf("%d",&n))
{
printf("Case %d: %d\n",cas++,dp[n]);
}
return 0;
}