題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4472
題目大意:給你N個節點,求用這N個節點組成的軸對稱的異構的樹的數量。
思路:n=1時,只有一顆;n=2時,也只有一顆,n=3時,有兩顆;關於根節點那一個軸對稱,則根節點下一定是m顆都含有k個節點的樹,而且m*k=n-1(除去根節點);即n個節點組成對稱樹的數量等於1....n-1中,能被n-1整除的數的節點數的對稱的樹的總和,一種動規的思想。
代碼:
#include<cstdio>
#include<cstring>
int ans[1005];
void getans()
{
ans[1]=1;
ans[2]=1;
ans[3]=2;
ans[4]=3;
for(int i=5;i<1001;i++)
{
for(int j=1;j<i;j++)
{
if((i-1)%j == 0)
{
ans[i] += ans[j];
ans[i] %= 1000000007;
};
}
}
}
int main()
{
int n,ncase=1;
memset(ans,0,sizeof(ans));
getans();
while(scanf("%d",&n)!=EOF)
{
printf("Case %d: %d\n",ncase++,ans[n]);
}
return 0;
}