• 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]);
    } 
     
  • 相关阅读:
    如何用C#代码管理SharePoint解决方案
    8 Reasons why SharePoint is Bad for Your Business 8个理由告诉你,为什么SharePoint对你的业务有害
    漫画教你了解SharePoint
    如何增强你的SharePoint 团队网站首页
    4 Reasons why SharePoint is Dying 四个理由告诉你,为什么SharePoint即将死去
    SharePoint 创建站点地图树视图及格式枚举截图
    C++虚函数与多态
    [DirectX 9.0笔记]第二章 渲染管线
    VC6.0 和 VS2010 time_t的区别
    [DirectX 9.0笔记]第一章 初始化 Direct3D
  • 原文地址:https://www.cnblogs.com/lipu123/p/13515024.html
Copyright © 2020-2023  润新知