A positive integer may be expressed as a sum of different prime numbers (primes), in one way or another. Given two positive integers n and k, you should count the number of ways to express n as a sum of k different primes. Here, two ways are considered to be the same if they sum up the same set of the primes. For example, 8 can be expressed as 3 + 5 and 5 + 3 but the are not distinguished.
When n and k are 24 and 3 respectively, the answer is two because there are two sets {2, 3, 19} and {2, 5, 17} whose sums are equal to 24. There are not other sets of three primes that sum up to 24. For n = 24 and k = 2, the answer is three, because there are three sets {5, 19}, {7, 17} and {11, 13}. For n = 2 and k = 1, the answer is one, because there is only one set {2} whose sum is 2. For n = 1 and k = 1, the answer is zero. As 1 is not a prime, you shouldn
输入格式
The input is a sequence of datasets followed by a line containing two zeros separated by a space. A dataset is a line containing two positive integers n and k separated by a space. You may assume that n ≤ 1120 and k ≤ 14.
输出格式
The output should be composed of lines, each corresponding to an input dataset. An output line should contain one non-negative integer indicating the number of the ways for n and k specified in the corresponding dataset. You may assume that it is less than 2^31.
样例输入
24 3 24 2 2 1 1 1 4 2 18 3 17 1 17 3 17 4 100 5 1000 10 1120 14 0 0
样例输出
2 3 1 0 0 2 1 0 1 55 200102899 2079324314
#include <stdio.h>
int jud[1121],prime[1121],xx=1;
long long num[1121][15];
void prim() {
int i,j;
jud[2]=1;
for(i=3; i<1121; i+=2)
jud[i]=1;
for(i = 2; i*i < 1121; i++)
if(jud[i]==1)
for(j = i*i; j < 1121; j += i)
jud[j] = 0;
prime[xx++]=2;
for(j=1; j<1120; j+=2)
if(jud[j]==1) prime[xx++]=j;
}
int main() {
int n,k,i,j,t,m,tt=0;
prim();
num[0][0]=1;
for(i=1; i<xx; i++)
for(j=1120-prime[i]; j>=0; j--)
for(m=14; m>0; m--)
num[j+prime[i]][m]+=num[j][m-1];
while(scanf("%d%d",&n,&k)==2) {
if(n==0&&k==0) break;
printf("%d\n",num[n][k]);
}
return 0;
}