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;
}