#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
const int inf=1e9+7;
int dp[N];
int main(){
int n;
int Case=1;
while(scanf("%d",&n)!=EOF){
memset(dp,0,sizeof(dp));
dp[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
if((i-1)%j==0){
dp[i]+=dp[j];
dp[i]%=inf;
}
}
}
printf("Case %d: %d\n",Case++,dp[n]);
}
return 0;
}
对于i来说,留下一个作为boss节点,对剩下的进行排列,要求是同一层具有相同的个数,枚举相同子树上的数量j,如果j符合条件则加上dp[j],dp[j]表示j个节点所有符合条件的数量,j有不同的符合条件的子树,这里是将剩下的分成(i-1)/j个j,当一个j形状改变是,其他j同时改变,就还是符合条件的了。
hdu 4472 Count dp
最新推荐文章于 2019-08-08 21:29:20 发布