http://acm.hdu.edu.cn/showproblem.php?pid=2189
用数组group[i][j]表示共i个人,以第j个素数为最大分组人数时,共有多少种分组情况。
则group[i][j]=sum(group[i-prime[j][k]) ,其中0<=k<=j 保证第j个素数为最大分组人数,即保证个体无差异。
#include <iostream>
using namespace std;
#define N 155
#define M 36
bool isprime[N];
int prime[M],group[N][M];
void init_prime(){
memset(isprime,true,sizeof(isprime));
isprime[0]=false;
isprime[1]=false;
int i,j;
for (i=2;i<13;i++)
if (isprime[i])
for (j=i;j*i<N;j++)
isprime[j*i]=false;
for (i=0,j=1;i<N;i++)
if (isprime[i]){
prime[j]=i;
j++;
}
}
void init_group(){
int i,j,sum,k;
memset(group,0,sizeof(group));
group[0][0]=1;
group[2][1]=1;
for (i=3;i<N;i++)
for (j=1;j<M&&prime[j]<=i;j++){
sum=0;
for (k=0;k<=j;k++)
sum+=group[i-prime[j]][k];
group[i][j]=sum;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("2189in.txt","r",stdin);
#endif
init_prime();
init_group();
int c,n,sum,i;
scanf("%d",&c);
while (c--){
scanf("%d",&n);
sum=0;
for (i=0;i<M;i++)
sum+=group[n][i];
printf("%d\n",sum);
}
return 0;
}