题目链接:http://www.jxsfczx.cn:888/problem/311
时间:1 秒 空间:512 MB

问题描述

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

例如9的质数和表达式就有四种本质不同的形式:9=2+5+2=2+3+2+2=3+3+3=2+7 。

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

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

输入格式

每一行存放一个自然数n(2≤n≤200)。

输出格式

输出自然数n的本质不同的质数和表达式的数目。

样例输入

2
200

样例输出

1
9845164

解题思路

先把素数筛出来,然后跑一遍完全背包就行了。
Accepted Code:

#include <bits/stdc++.h>
using namespace std;
int isprime[205], prime[205], dp[205];
void is_prime(int n) {
    int k = 0;
    for (int i = 2; i <= n; i++)
        isprime[i] = 1;
    for (int i = 2; i <= n; i++) {
        if (isprime[i]) {
            prime[k++] = i;
            for (int j = i << 1; j <= n; j += i)
                isprime[j] = 0;
        }
    }
}
int main() {
    int n;
    scanf("%d", &n);
    dp[0] = 1;
    is_prime(n);
    for (int i = 0; prime[i] && prime[i] <= n; i++)
        for (int j = prime[i]; j <= n; j++)
            dp[j] += dp[j - prime[i]];
    printf("%d\n", dp[n]);
    return 0;
}