輸入n和k,使k個不相同的素數的和爲n,求共有多少組
提示
1)dp[i][j]中i表示當前的和,j表示含有素數的個數
#include <stdio.h>
#include <string.h>
int prime(int n) //判素數
{
if(n==0||n==1)
return 0;
if(n==2||n==3)
return 1;
int i;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int f[1005];
int p[1005];
int mark[1005];
long long dp[1500][16];
int main()
{
memset(mark,0,sizeof(mark));
int i,j,l;
int tot=0;
for(i=0;i<1500;i++) //將素數存於p[1500]中
{
if(mark[i]==0)
{
if(prime(i))
{
p[tot++]=i;
for(j=2;j*i<1500;j++)
mark[i*j]=1;
}
}
}
memset(dp,0,sizeof(dp));
dp[0][0]=1;
for(i=0;i<tot;i++) //加入的素數
{
for(j=1120;j>=p[i];j--) //加上素數之後的和
{
for(l=15;l>0;l--) //加上素數之後的素數個數
{
dp[j][l]+=dp[j-p[i]][l-1];
}
}
}
int n,k;
while(scanf("%d%d",&n,&k)!=-1)
{
if(n==0&&k==0)
break;
printf("%I64d\n",dp[n][k]);
}
return 0;
}