Sum of Different Primes
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 3684   Accepted: 2252

Description

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’t count {1}. For n = 4 and k = 2, the answer is zero, because there are no sets of two different primes whose sums are 4.

Your job is to write a program that reports the number of such ways for the given n and k.

Input

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.

Output

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 231.

Sample Input

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

Sample Output

2
3
1
0
0
2
1
0
1
55
200102899
2079324314

题意:

给出n,k问将n分解成k个素数有多少种分法。

分析:

首先使用素数筛筛选出素数。

设dp[i][j]:将j分解成i个素数的方案数,那么:dp[i][j]=dp[i-1][j-su[k]]。

for枚举所有素数

  for枚举1150->1所有的值

    for枚举方案14->1

最后读入n,k直接输出dp[k][n]即可。

AC code:

#include<cstdio>
#include<cstring>
using namespace std;
bool u[];
int su[];
int dp[][];
int psu[];
int num;
void olas()
{
num=;
memset(u,true,sizeof(u));
for(int i=;i<=;i++)
{
if(u[i]) su[num++]=i;
for(int j=;j<num;j++)
{
if(i*su[j]>) break;
u[i*su[j]]=false;
if(i%su[j]==) break;
}
}
psu[]=su[];
for(int i=;i<num;i++)
{
psu[i]=psu[i-]+su[i];
}
}
void pre()
{
dp[][]=;
for(int i=;i<num;i++)
{
for(int j=;j>=;j--)
{
if(j>=su[i])
{
for(int k=;k>=;k--)
{
dp[k][j]+=dp[k-][j-su[i]];
}
}
else break;
}
}
}
int main()
{
int n,k;
olas();
pre();
freopen("input.txt","r",stdin);
while(~scanf("%d%d",&n,&k)&&n&&k)
{
printf("%d\n",dp[k][n]);
}
return ;
}

最新文章

  1. 【记录】xUnit for vs2012/vs2013
  2. HTTP协议—— 简单认识TCP/IP协议
  3. 常用js方法
  4. System类
  5. 【摘】Chrome解决高版本Stable Beta扩展程序强制停用问题
  6. [CLR via C#]13. 接口
  7. MySQL错误: could not retrieve transation read-only status server
  8. Mvc中DropDownList 和DropDownListFor的常用方法
  9. mvc Area相关技术
  10. JVM学习笔记一:内存管理
  11. python--DenyHttp项目(1)--socket编程:服务器端进阶版socketServer
  12. hive元数据库表分析及操作
  13. AngularJS - 使用RequireJS还是Browserify?
  14. SOFA 源码分析 — 自定义线程池原理
  15. scala的多种集合的使用(6)之映射Map的操作方法
  16. May 30. 2018 Week 22nd Wednesday
  17. angular把echarts封装为指令(配合requirejs)
  18. CentOS中配置Kafka集群
  19. unity编辑器之自动提示订外卖
  20. Xcode解决“Implicit declaration of function &#39;XXX&#39; is invalid in C99” 警告或报错

热门文章

  1. Java开发设计——UML类图
  2. MySQL基础(二)(约束以及修改数据表)
  3. Hystrix工作流程解析
  4. Linux之Shell编程(15)
  5. 浅析Java中线程组(ThreadGroup类)
  6. python3偏函数
  7. 13 个 NPM 快速开发技巧
  8. python之滑动认证(图片)
  9. vue 开发系列(九) VUE 动态组件的应用
  10. [TCP/IP]TCP服务端accept发生在三次握手的哪一个阶段