A+B Problem(再升级)

题目背景

题目名称是吸引你点进来的。

实际上该题还是很水的。

题目描述

  • $1+1=?$ 显然是 $2$。
  • $a+b=?$ P1001 回看不谢。
  • 哥德巴赫猜想 似乎已呈泛滥趋势。

_以上纯属个人吐槽_

给定一个正整数 $n$,求将其分解成若干个素数之和的方案总数。

输入格式

一行一个正整数 $n$。

输出格式

一行一个整数表示方案总数。

样例 #1

样例输入 #1

1
7

样例输出 #1

1
3

样例 #2

样例输入 #2

1
20

样例输出 #2

1
26

提示

样例解释

存在如下三种方案:

  • $7=7$。
  • $7=2+5$。
  • $7=2+2+3$。

数据范围及约定

  • 对于 $30\%$ 的数据 $1\le n\le 10$。
  • 对于 $100\%$ 的数据,$1\le n\le 10^3$。

题解

题目解析

一道可以无限选的背包,方法就是就地从前往后滚动.

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

#define endl "\n"
#define CIN_ ios::sync_with_stdio(0)
#define CIN cin.tie(0)
#define MAXN(size) const long long MAXN = size + 100
#define mem(name,value) memset(name,value,sizeof(name))
#define fa(a,n,p) for(int i=a;i<=n;i+=p)
#define fb(a,n,p) for(int i=a;i>=n;i-=p)
#define cin(length,var) for(int i=1;i<=length;i++) cin >> var[i]
#define T_ int T;cin >> T;while(T--)
typedef long long ll;
typedef unsigned long long ull;

int prime[1000],sum=0;

void getprime(){
for(int i=2;i<=1100;i++){
int temp = 1;
for(int j=2;j<i;j++){
if(i % j == 0){
temp = 0;
break;
}
}
if(temp) prime[++sum] = i;
}
}

MAXN(1e3);

ll dp[MAXN];

signed main(){
getprime();
int n;
cin >> n;
dp[0] = 1;
for(int i=1;n>=prime[i];i++){
for(int j=prime[i];j<=n;j++){
dp[j] += dp[j-prime[i]];
}
}
cout << dp[n] << endl;
return 0;
}