题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4472
思路:每次都要把那个终极boss除去,然后dp[i]=sum{dp[j]}((i-1)%j==0);
原因:根据题意,一个节点一定要用去做树根,所以剩下i-1个点,这i-1个节点把它分成几份,这几份完全相同,其本身强烈对称,然后不断更新就行了。。。orz
View Code
1 #include<iostream> 2 const int N=1010; 3 const int MOD=1e9+7; 4 using namespace std; 5 int dp[N]; 6 7 void Initiate(){ 8 dp[1]=dp[2]=1; 9 for(int i=3;i<=1001;i++){ 10 for(int j=1;j<i;j++){ 11 //每次都要除去那个终极boss,每一层上的根拥有的子树的数目是相同的 12 if((i-1)%j==0){ 13 dp[i]+=dp[(i-1)/j]; 14 dp[i]%=MOD; 15 } 16 } 17 } 18 } 19 20 int main(){ 21 Initiate(); 22 int n,_case=1; 23 while(~scanf("%d",&n)){ 24 printf("Case %d: %d\n",_case++,dp[n]); 25 } 26 return 0; 27 }