P2563 [AHOI2001]质数和分解

题目描述

任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式。例如,9 的质数和表达式就有四种本质不同的形式:

9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 。

这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式。

试编程求解自然数 n 可以写成多少种本质不同的质数和表达式。

输入输出格式

输入格式:

文件中的每一行存放一个自然数 n(2 < n < 200) 。

输出格式:

依次输出每一个自然数 n 的本质不同的质数和表达式的数目。

输入输出样例

输入样例#1:

2
200

输出样例#1:

1
9845164

先生成一个质数表然后用个小背包就可以了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #define lli long long int
 7 using namespace std;
 8 void read(lli &n)
 9 {
10     char c=‘+‘;lli x=0;bool flag=0;
11     while(c<‘0‘||c>‘9‘)
12     {c=getchar();if(c==‘-‘)flag=1;}
13     while(c>=‘0‘&&c<=‘9‘)
14     {x=x*10+(c-48);c=getchar();}
15     flag==1?n=-x:n=x;
16 }
17 lli n,m;
18 lli a[10001];
19 lli dp[10001];
20 lli sum[10001];
21 lli vis[10001];
22 int main()
23 {
24     dp[0]=1;
25     vis[1]=1;
26     for(lli i=2;i<=201;i++)
27         if(!vis[i])
28         for(lli j=i*i;j<=301;j+=i)
29             vis[j]=1;
30     for(lli i=2;i<=200;i++)
31         if(vis[i]==0)
32         for(lli j=i;j<=200;j++)
33             dp[j]=dp[j-i]+dp[j];
34     while(scanf("%d",&n)==1)
35     {
36         printf("%lld\n",dp[n]);
37     }
38     return 0;
39 }
时间: 2024-10-01 22:19:29

P2563 [AHOI2001]质数和分解的相关文章

洛谷P2563 [AHOI2001]质数和分解

题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如,9 的质数和表达式就有四种本质不同的形式: 9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 . 这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式. 试编程求解自然数 n 可以写成多少种本质不同的质数和表达式. 输

洛谷 [AHOI2001]质数和分解

题目描述 Description 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如,9 的质数和表达式就有四种本质不同的形式:9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 .这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式.试编程求解自然数 n 可以写成多少种本质不同的

[Luogu P2563]质数和分解

题目链接 话不多说,这是一道质数题+完全背包.先预处理筛出质数,直接背包就行. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int pr[205],tot,x,f[205]; bool vis[205]; int main(){ for(int i=2;i<=200;++i){ if(!vis[i]){ pr

质数和分解(完全背包)

题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如,9 的质数和表达式就有四种本质不同的形式: 9 = 2 + 5 + 2 = 2 + 3 + 2 + 2 = 3 + 3 + 3 = 2 + 7 . 这里所谓两个本质相同的表达式是指可以通过交换其中一个表达式中参加和运算的各个数的位置而直接得到另一个表达式. 试编程求解自然数 n 可以写成多少种本质不同的质数和表达式. 输

质数筛法详解

理论及实现 定义: 若一个正整数无法被除了1和它本身的之外的任何自然数整除,则称该为质数(素数),否则称该正整数为合数. 判定方法 试除法 引理: 若一个正整数\(N\)为合数,则存在一个能整除\(N\)的数\(T\)且\(2≤T≤ \sqrt N\) 证明就不再赘述,读者可以自行验证: 因此,我们只需要枚举\(2-\sqrt N\).只要这之中的所有数都不能被\(N\)整除,那么\(N\)就是质数了: #include<cmath> bool is_prime(int n) { if(n &

【省选水题集Day1】一起来AK水题吧! 题目(更新到A)

题解:http://www.cnblogs.com/ljc20020730/p/6937954.html 水题A: [AHOI2001]质数和分解 题目网址: https://www.luogu.org/problem/show?pid=2563 题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如,9 的质数和表达式就有四种本质不同的形式: 9 = 2 + 5 + 2 =

【省选水题集Day1】一起来AK水题吧! 题解(更新到A)

题目:http://www.cnblogs.com/ljc20020730/p/6937936.html 水题A:[AHOI2001]质数和分解 安徽省选OI原题!简单Dp. 一看就是完全背包求方案数! 完全背包都会打吧,原来是最优值,现在是累计值. 状态转移方程:f[j]=f[j]+f[j-w[i]],w[i]是待选质数. 理解:一个数要拆成若干素数和,等同于拆成所有该数减去一个素数差的方案数之和(而不是最优方案数) 但这么做需要初始化为0,同时用滚动数组可以减小时间和空间复杂度. 代码如下:

BZOJ 3798 特殊的质数 分块打表

题目大意:求[l,r]区间内有多少个质数可以分解为两个正整数的平方和 考虑到对于一个数Check一下是O(√n)的 我们可以将3*10^8分成3000块 每块10W 对于整块的打表求出有多少个质数 块内暴力 令n为块的大小 则时间复杂度为O(n√n) 打表时忘加优化忘开O2 打了一下午 各种酸爽 #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include

(笔试题)质数因子Prime Factor

题目: Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1^k1 * p2^k2 *...*pm^km. 输入描述: Each input file contains one test case which gives a positive integer N in the range of long int. 输出