• 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]);
    } 
     
  • 相关阅读:
    107.JsonResponse
    106.HttpResponse对象详解
    前端学习笔记系列一:2 Vue的单文件组件
    前端学习笔记系列一:1.export default / export const
    @vue-cli的安装及vue项目创建
    Github版本控制系统
    C# 篇基础知识11——泛型和集合
    C# 篇基础知识10——多线程
    C# 篇基础知识9——特性、程序集和反射
    C# 篇基础知识8——正则表达式
  • 原文地址:https://www.cnblogs.com/lipu123/p/13515024.html
Copyright © 2020-2023  润新知