POJ 3132 DP+素数筛
| 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 ;
}
POJ 3132 DP+素数筛的更多相关文章
- codeforces 822 D. My pretty girl Noora(dp+素数筛)
题目链接:http://codeforces.com/contest/822/problem/D 题解:做这题首先要推倒一下f(x)假设第各个阶段分成d1,d2,d3...di组取任意一组来说,如果第 ...
- Codeforces 264B Good Sequences(DP+素数筛)
题目链接:http://codeforces.com/problemset/problem/264/B 题目大意:给出n个单调递增的数,让你找出最长的好序列,好序列是一种单调递增的并且相邻元素的最大公 ...
- poj 2689 区间素数筛
The branch of mathematics called number theory is about properties of numbers. One of the areas that ...
- codeforces 569C C. Primes or Palindromes?(素数筛+dp)
题目链接: C. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes in ...
- 素数筛 poj 2689
素数筛 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; ...
- poj 3048 Max Factor(素数筛)
这题就是先写个素数筛,存到prime里,之后遍历就好,取余,看是否等于0,如果等于0就更新,感觉自己说的不明白,引用下别人的话吧: 素数打表,找出20000之前的所有素数,存入prime数组,对于每个 ...
- POJ 3126 Prime Path (bfs+欧拉线性素数筛)
Description The ministers of the cabinet were quite upset by the message from the Chief of Security ...
- Prime Path素数筛与BFS动态规划
埃拉托斯特尼筛法(sieve of Eratosthenes ) 是古希腊数学家埃拉托斯特尼发明的计算素数的方法.对于求解不大于n的所有素数,我们先找出sqrt(n)内的所有素数p1到pk,其中k = ...
- Codeforces 385C - Bear and Prime Numbers(素数筛+前缀和+hashing)
385C - Bear and Prime Numbers 思路:记录数组中1-1e7中每个数出现的次数,然后用素数筛看哪些能被素数整除,并加到记录该素数的数组中,然后1-1e7求一遍前缀和. 代码: ...
随机推荐
- Linux目录和文件——目录格式
Linux目录和文件——目录格式 摘要:本文主要了解了Linux系统的目录格式. 一切皆文件 Linux下“一切皆文件”是Unix/Linux的基本哲学之一. Linux中所有内容都是以文件的形式保存 ...
- switch case加范围判断
switch case是可以加范围判断的,但是语法有少许变化,参数不能写在switch里面,而是写在外面,如: const i = 3; switch (true) { case (i <= 0 ...
- python网络编程-1
1.网络基础 回顾计算IP所处网段方式 #128 64 32 16 8 4 2 1 #IP1 = 192.168.9.1/24 # 11000000 10101000 00001001 0000000 ...
- 英语rhodita铑金RHODITA单词
铑金RHODITA,铑属铂系元素.铂系元素几乎完全成单质状态存在,高度分散在各种矿石中,例如原铂矿.硫化镍铜矿.磁铁矿等.铂系元素几乎无例外地共同存在,形成天然合金.在含铂系元素矿石中,通常以铂为主要 ...
- Scrum 冲刺第二篇
我们是这次稳了队,队员分别是温治乾.莫少政.黄思扬.余泽端.江海灵 一.会议 1.1 26号站立式会议照片: 1.2 昨天已完成的事情 团队成员 任务内容 黄思扬 Web 端首页.内容管理页开发. ...
- Centos7安装和配置Tomcat8
第一步:下载Tomcat8压缩包 进入 http://tomcat.apache.org/download-80.cgi 下载tar.gz压缩包 第二步:用xshell工具把压缩包上传到/home/d ...
- Win7共享只看到部分文件
把192.168.70.88这台机器的Android目录做为共享文件夹. 共享端:windows server 用户端:其它pc机安装windows7 或windows 10 在用户端只能看到部分文件 ...
- bert剪枝系列——Are Sixteen Heads Really Better than One?
1,概述 剪枝可以分为两种:一种是无序的剪枝,比如将权重中一些值置为0,这种也称为稀疏化,在实际的应用上这种剪枝基本没有意义,因为它只能压缩模型的大小,但很多时候做不到模型推断加速,而在当今的移动设备 ...
- conan使用(四)--打包二进制库
前面总结过如何打包一个存头文件库,那种情况下非常简单,因为只需要将源文件拷贝就行了.现在来研究下如何打包一个正常情况下会生成动态库或静态库的包.参考文档:https://docs.conan.io/e ...
- PDFium-PDF开源之旅
1.安装python 2.7 https://blog.csdn.net/lzfly/article/details/27077487 https://www.jianshu.com/p/8bb348 ...