#include <stdio.h>
#include <string.h>
int prime(int x)
{
int i;
if(x<=1)return 0;
for(i=2;i<=x/i;i++){
if(x%i==0)return 0;
}
return 1;
}
int main()
{
int c,n,i,j=0,k,s[200]={0},c1[200],c2[200];
for(i=2;i<=150;i++){
if(prime(i)==1){
s[j++]=i;
}
}
s[j]=1e7;
scanf("%d",&c);
while(c--){
scanf("%d",&n);
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
for(i=0;i<=n;i=i+2)c1[i]=1;//这里i每次加2是因为素数表第一个是2,比如6可以分为2 2 2
for(i=1;s[i]<=150;i++){
//printf("%d\n",s[i]);
for(j=0;j<=n;j++){//j是志愿者人数
for(k=0;k+j<=n;k=k+s[i]){//每次加s[i]意思就是比如目前前j人的分组方法有a种,分了b组,那么j+s[i]的分组方法有a种,
c2[k+j]+=c1[j];//分了b+1组,j+s[i]+s[i]的分组方法也有a种,分了b+2组
//printf("111111\n");
}
}
for(j=0;j<=n;j++){
c1[j]=c2[j];
c2[j]=0;
}
}
printf("%d\n",c1[n]);
}
return 0;
}
这道题感觉比前面几道母函数问题抽象,比较难想,题蛮不错的,回头再看看。
题目要求每组人数必须是素数,就先将150内的素数存入数组,把每个素数可以抽象成硬币问题里的每个硬币。然后就可以套模板惹