• Min25筛求1-n内的素数和


      1 //#include <bits/stdc++.h>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<iostream>
      6 #include<string>
      7 #include<vector>
      8 #include<stack>
      9 #include<bitset>
     10 #include<cstdlib>
     11 #include<cmath>
     12 #include<set>
     13 #include<list>
     14 #include<deque>
     15 #include<map>
     16 #include<queue>
     17 
     18 using namespace std;
     19 
     20 const int N = 1000010;
     21 
     22 typedef long long LL;
     23 LL TT,nn,k;
     24 namespace Min25 {
     25 
     26     int prime[N], id1[N], id2[N], flag[N], ncnt, m;
     27   
     28     LL g[N], sum[N], a[N], T, n;
     29     inline void fff()
     30     {
     31         for(int i=0;i<=N;i++){
     32             prime[i]=0;
     33             id1[i]=0;
     34             id2[i]=0;
     35             flag[i]=0;
     36             g[i]=0;
     37             sum[i]=0;
     38             a[i]=0;
     39         }
     40         ncnt=0;
     41         m=0;
     42         T=0;
     43         n=0;
     44     }
     45     inline int ID(LL x) {
     46         return x <= T ? id1[x] : id2[n / x];
     47     }
     48 
     49     inline LL calc(LL x) {
     50         return x * (x + 1) / 2 - 1;
     51     }
     52 
     53     inline LL f(LL x) {
     54         return x;
     55     }
     56 
     57     inline void init() {
     58         T = sqrt(n + 0.5);
     59         for (int i = 2; i <= T; i++) {
     60             if (!flag[i]) prime[++ncnt] = i, sum[ncnt] = sum[ncnt - 1] + i;
     61             for (int j = 1; j <= ncnt && i * prime[j] <= T; j++) {
     62                 flag[i * prime[j]] = 1;
     63                 if (i % prime[j] == 0) break;
     64             }
     65         }
     66         for (LL l = 1; l <= n; l = n / (n / l) + 1) {
     67             a[++m] = n / l;
     68             if (a[m] <= T) id1[a[m]] = m; else id2[n / a[m]] = m;
     69             g[m] = calc(a[m]);
     70         }
     71         for (int i = 1; i <= ncnt; i++) 
     72             for (int j = 1; j <= m && (LL)prime[i] * prime[i] <= a[j]; j++) 
     73                 g[j] = g[j] - (LL)prime[i] * (g[ID(a[j] / prime[i])] - sum[i - 1]);
     74     }
     75 
     76     inline LL solve(LL x) {
     77         if (x <= 1) return x;
     78         return n = x, init(), g[ID(n)];
     79     }
     80 
     81 }
     82 
     83 void extend_gcd(LL a,LL b,LL &x,LL &y)
     84 {
     85     if(b==0) {
     86         x=1,y=0;
     87         return;
     88     }
     89     extend_gcd(b,a%b,x,y);
     90     LL tmp=x;
     91     x=y;
     92     y=tmp-(a/b)*y;
     93 }
     94 LL mod_inverse(LL a,LL m)
     95 {
     96     LL x,y;
     97     extend_gcd(a,m,x,y);
     98     return (m+x%m)%m;
     99 }
    100 /*int main()
    101 {
    102     LL sum;
    103     cin>>TT;
    104     while(TT--){
    105         sum=0;
    106 
    107         scanf("%lld%lld",&nn,&k);
    108         if(nn==1){
    109             printf("0
    ");
    110         }else if(nn==2){
    111             printf("6
    ");
    112         }else{
    113         LL a=mod_inverse(2,k);
    114         //cout<<a<<endl;
    115         sum=(((((nn%k)*(nn%k))%k+(nn*3)%k)%k)*a)%k;
    116         //cout<<sum<<endl;
    117         Min25::fff();
    118         sum=(sum-4+Min25::solve(nn+1))%k;
    119         printf("%lld
    ",sum%k);
    120         }
    121     }
    122     return 0;
    123 }*/
    124 int main()
    125 {
    126     int n;
    127     scanf("%d",&n);
    128     printf("%d
    ",Min25::solve(n));
    129 }
    //#include <bits/stdc++.h>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<stack>
    #include<bitset>
    #include<cstdlib>
    #include<cmath>
    #include<set>
    #include<list>
    #include<deque>
    #include<map>
    #include<queue>

    using namespace std;

    const int N = 1000010;

    typedef long long LL;
    LL TT,nn,k;
    namespace Min25 {

        int prime[N], id1[N], id2[N], flag[N], ncntm;
      
        LL g[N], sum[N], a[N], Tn;
        inline void fff()
        {
            for(int i=0;i<=N;i++){
                prime[i]=0;
                id1[i]=0;
                id2[i]=0;
                flag[i]=0;
                g[i]=0;
                sum[i]=0;
                a[i]=0;
            }
            ncnt=0;
            m=0;
            T=0;
            n=0;
        }
        inline int ID(LL x) {
            return x <= T ? id1[x] : id2[n / x];
        }

        inline LL calc(LL x) {
            return x * (x + 1) / 2 - 1;
        }

        inline LL f(LL x) {
            return x;
        }

        inline void init() {
            T = sqrt(n + 0.5);
            for (int i = 2i <= Ti++) {
                if (!flag[i]) prime[++ncnt] = isum[ncnt] = sum[ncnt - 1] + i;
                for (int j = 1j <= ncnt && i * prime[j] <= Tj++) {
                    flag[i * prime[j]] = 1;
                    if (i % prime[j] == 0break;
                }
            }
            for (LL l = 1l <= nl = n / (n / l) + 1) {
                a[++m] = n / l;
                if (a[m] <= Tid1[a[m]] = melse id2[n / a[m]] = m;
                g[m] = calc(a[m]);
            }
            for (int i = 1i <= ncnti++) 
                for (int j = 1j <= m && (LL)prime[i] * prime[i] <= a[j]; j++) 
                    g[j] = g[j] - (LL)prime[i] * (g[ID(a[j] / prime[i])] - sum[i - 1]);
        }

        inline LL solve(LL x) {
            if (x <= 1return x;
            return n = xinit(), g[ID(n)];
        }

    }

    void extend_gcd(LL a,LL b,LL &x,LL &y)
    {
        if(b==0) {
            x=1,y=0;
            return;
        }
        extend_gcd(b,a%b,x,y);
        LL tmp=x;
        x=y;
        y=tmp-(a/b)*y;
    }
    LL mod_inverse(LL a,LL m)
    {
        LL x,y;
        extend_gcd(a,m,x,y);
        return (m+x%m)%m;
    }
    /*int main()
    {
        LL sum;
        cin>>TT;
        while(TT--){
            sum=0;

            scanf("%lld%lld",&nn,&k);
            if(nn==1){
                printf("0 ");
            }else if(nn==2){
                printf("6 ");
            }else{
            LL a=mod_inverse(2,k);
            //cout<<a<<endl;
            sum=(((((nn%k)*(nn%k))%k+(nn*3)%k)%k)*a)%k;
            //cout<<sum<<endl;
            Min25::fff();
            sum=(sum-4+Min25::solve(nn+1))%k;
            printf("%lld ",sum%k);
            }
        }
        return 0;
    }*/
    int main()
    {
        int n;
        scanf("%d",&n);
        printf("%d ",Min25::solve(n));
    }
  • 相关阅读:
    常用WebService一览表
    Generic Data Access Objects [转]
    spring hibernate properties详解
    SpringMVC常用基础知识【转】
    向PLSQL导入txt,csv文件
    打印金字塔图案
    经常使用的文件工具类
    求两个数的最大公约数
    155个建议笔记1
    用Tika读取文件(不需要考虑文件格式)
  • 原文地址:https://www.cnblogs.com/zpj61/p/13702729.html
Copyright © 2020-2023  润新知