Prime(dp+素数筛)

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

输入

一个自然数 N , 2≤N≤2000。

输出

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

样例输入 Copy

2

样例输出 Copy

1

这个题就是爆了ll,所以要用用__int128
void scan(__int128 &x) { //输入
    x = 0;
    int f = 1;
    char ch;
    if((ch = getchar()) == '-') f = -f;
    else x = x*10 + ch-'0';
    while((ch = getchar()) >= '0' && ch <= '9')
        x = x*10 + ch-'0';
    x *= f;
}

void _print(__int128 x) {
    if(x > 9) _print(x/10);
    putchar(x%10 + '0');
}
void print(__int128 x) { //输出
    if(x < 0) {
        x = -x;
        putchar('-');
    }
    _print(x);
}
#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include<string> 
#include <math.h> 
#include<memory.h>
#include<cstring>
using namespace std; 
typedef unsigned long long ll; 
void scan(__int128 &x) { //输入
    x = 0;
    int f = 1;
    char ch;
    if((ch = getchar()) == '-') f = -f;
    else x = x*10 + ch-'0';
    while((ch = getchar()) >= '0' && ch <= '9')
        x = x*10 + ch-'0';
    x *= f;
}

void _print(__int128 x) {
    if(x > 9) _print(x/10);
    putchar(x%10 + '0');
}
void print(__int128 x) { //输出
    if(x < 0) {
        x = -x;
        putchar('-');
    }
    _print(x);
}
const int maxn=3e3+100;
int biaoji[maxn];
int p[maxn];
int cnt=0;
void inint(){
    for(int i=2;i<=maxn;i++){
        if(!biaoji[i]){
            p[++cnt]=i;
        }
        for(int j=1;j<=cnt&&i*p[j]<maxn;j++){
            biaoji[i*p[j]]=1;
            if(i%p[j]==0){
                break;
            }
        } 
    }
}
int n;
__int128 f[maxn];
void c(){
    cin>>n;
    f[0]=1;
}
int main(){
    inint();
    c();
    for(int i=1;i<=cnt;i++){
        for(int j=p[i];j<=n;j++){
            f[j]+=f[j-p[i]];
        }
    }
    print(f[n]);
} 
 
原文地址:https://www.cnblogs.com/lipu123/p/13515024.html