题目链接
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
将 20192019 拆分为若干个两两不同的质数之和,一共有多少种不同的方法?
注意交换顺序视为同一种方法,例如 2 + 2017 = 20192+2017=2019 与 2017 + 2 = 20192017+2=2019 视为同一种方法。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路
1.数组f[i]含义在数字大小为i的条件下,能拆分为若干个两两不同的质数之和的方法数.(n>=2)
2.对于f[j]而言可以看成是在数字总和是f[j-i](其中i是素数)的条件下去装上一个素数i,那么此 时f[j]的总数就要相应地加上f[j-i]时的方法数
得到状态转移方程
f[j]=f[j]+f[j-i];
3.无论装哪个素数其第一次装的方法数总是1,因此f[0]=1;
AC代码
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
bool isprime(int n) {//判断素数
if (n < 2)return 0;
for (int i = 2; i <= n / i; i++) {
if (n % i == 0)return 0;
}
return 1;
}
ll f[2020];
int main() {
f[0] = 1;
for (int i = 2; i <= 2019; i++) {
if (isprime(i)) {
for (int j = 2019; j - i >= 0; j--) {
if (f[j - i] != 0)f[j]+=f[j-i];
}
}
}
cout << f[2019] << endl;
return 0;
}