hdu 4472 dp

来源:互联网 发布:网络上的v是什么意思 编辑:程序博客网 时间:2024/05/16 07:29

n个人,每个人都有上司,除了第一个人,要求同一级别的人他们的下属是一样多的。比如

问给出你人数,有多少种情况。


dp[i]代表当有i个人时有多少种情况。

那么从第一个人开始往后推,如果i-1能被j除尽(代表i个人减去大boss后被分成(i-1)/j份,每份j个人),那就dp[i]+=dp[j];


#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>using namespace std;int n;long long dp[1111];int main(){memset(dp,0,sizeof(dp));dp[1]=1;dp[2]=1;dp[3]=2;for(int i=4;i<=1010;i++){for(int j=1;j<i;j++){if((i-1)%j==0)dp[i]=(dp[i]+dp[j])%1000000007;//if(i==4)printf("!! j=%d mod=%d dp[4]=%d\n",j,(i-1)%j,dp[i]);}}int cas=1;while(scanf("%d",&n)!=EOF){printf("Case %d: %lld\n",cas++,dp[n]);}return 0;}