zoukankan      html  css  js  c++  java
  • 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#算法收集
    算法导论数论最大公约数
    算法导论数论初等数论的概念
    Poj3090 欧拉函数求和
    算法导论数论素数测试和pollard整数因子分解
    Poj 2407
    算法导论数论模运算
    Poj2478
    Window Phone7中SL开发中的位图和从相机获取图片
    WP7中SilverLight中触摸事件和事件路由
  • 原文地址:https://www.cnblogs.com/lipu123/p/13515024.html
Copyright © 2011-2022 走看看