WOJ1274-Sum of Different Primes

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


全部评论

相关推荐

不亏是提前批,神仙打架,鼠鼠不配了
站队站对牛:现在92都报工艺岗了
投递韶音科技等公司7个岗位
点赞 评论 收藏
分享
哈哈哈哈哈哈哈哈哈哈这个世界太美好了
凉风落木楚山秋:毕业出路老师不管,你盖个章他好交差就完事了,等你盖完毕业了就不关他事情了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务