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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值