zoukankan      html  css  js  c++  java
  • 杜教筛

    https://www.luogu.org/problemnew/show/P4213

    #include<bits/stdc++.h>
    #include<tr1/unordered_map>
    #define fi first
    #define se second
    #define INF 0x3f3f3f3f
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define pqueue priority_queue
    #define NEW(a,b) memset(a,b,sizeof(a))
    #define lowbit(x) (x&(-x))
    #define si(x) scanf("%d",&x)
    #define sl(x) scanf("%lld",&x)
    #define lc (d<<1)
    #define rc (d<<1|1)
    const double pi=4.0*atan(1.0);
    const double e=exp(1.0);
    const int maxn=6e6+8;
    typedef long long LL;
    typedef unsigned long long ULL;
    const LL mod=1e6+3;
    const ULL base=1e7+7;
    using namespace std;
    bool vis[maxn];
    int mu[maxn],sum1[maxn],phi[maxn];
    LL sum2[maxn];
    int cnt,prim[maxn];
    tr1::unordered_map<LL,LL>w1;
    tr1::unordered_map<int,int>w;
    void get(int N){
        phi[1]=mu[1]=1;
        for(int i=2;i<=N;i++){
            if(!vis[i]){
                prim[++cnt]=i;
                mu[i]=-1;phi[i]=i-1;
            }
            for(int j=1;j<=cnt&&prim[j]*i<=N;j++){
                vis[i*prim[j]]=1;
                if(i%prim[j]==0){
                    phi[i*prim[j]]=phi[i]*prim[j];
                    break;
                }
                else mu[i*prim[j]]=-mu[i],phi[i*prim[j]]=phi[i]*(prim[j]-1);
            }
        }
        for(int i=1;i<=N;i++)sum1[i]=sum1[i-1]+mu[i],sum2[i]=sum2[i-1]+phi[i];
    }
    int djsmu(int x){
        if(x<=6000000)return sum1[x];
        if(w.count(x))return w[x];
        int ans=1;
        for(int l=2,r;l<=x;l=r+1){
            r=x/(x/l);
            ans-=(r-l+1)*djsmu(x/l);
        }
        return w[x]=ans;
    }
    LL djsphi(LL x){
        if(x<=6000000)return sum2[x];
        if(w1.count(x))return w1[x];
        LL ans=x*(x+1)/2;
        for(LL l=2,r;l<=x;l=r+1){
            r=x/(x/l);
            ans-=(r-l+1)*djsphi(x/l);
        }
        return w1[x]=ans;
    }
    int main(){
        cin.tie(0);
        cout.tie(0);
        int T;
        cin>>T;
        get(6000000);
        int x;
        while(T--){
            scanf("%d",&x);
            printf("%lld %d
    ",djsphi(x),djsmu(x));
        }
    }

    http://www.51nod.com/Challenge/Problem.html#problemId=1244

    #include<bits/stdc++.h>
    #include<tr1/unordered_map>
    #define fi first
    #define se second
    #define INF 0x3f3f3f3f
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
    #define pqueue priority_queue
    #define NEW(a,b) memset(a,b,sizeof(a))
    #define lowbit(x) (x&(-x))
    #define si(x) scanf("%d",&x)
    #define sl(x) scanf("%lld",&x)
    #define lc (d<<1)
    #define rc (d<<1|1)
    const double pi=4.0*atan(1.0);
    const double e=exp(1.0);
    const int maxn=6e6+8;
    typedef long long LL;
    typedef unsigned long long ULL;
    const LL mod=1e6+3;
    const ULL base=1e7+7;
    using namespace std;
    bool vis[maxn];
    int mu[maxn],sum1[maxn];
    int cnt,prim[maxn];
    tr1::unordered_map<LL,LL>w;
    void get(int N){
        mu[1]=1;
        for(int i=2;i<=N;i++){
            if(!vis[i]){
                prim[++cnt]=i;
                mu[i]=-1;
            }
            for(int j=1;j<=cnt&&prim[j]*i<=N;j++){
                vis[i*prim[j]]=1;
                if(i%prim[j]==0){
                    break;
                }
                else mu[i*prim[j]]=-mu[i];
            }
        }
        for(int i=1;i<=N;i++)sum1[i]=sum1[i-1]+mu[i];
    }
    LL Sum(LL x) {
        return x <= 6000000 ? sum1[x] : w[x];
    }
    void DJ_shai(LL n) {
        for(LL i = n, y; i >= 1; i = n / (y + 1)) {
            y = n / i;
            if (y <= 6000000) continue;
            LL ret = 0;
            for (LL j = 2, l, pre = 1; j <= y; ++j) {
                l = y / j;
                j = y / l;
                ret += Sum(l) * (j - pre);
                pre = j;
            }
            w[y]=1ll-ret;
        }
    }
    int main(){
        get(6000000);
        LL x,y;
        scanf("%lld%lld",&x,&y);
        DJ_shai(y);
        DJ_shai(x-1);
        printf("%lld",Sum(y)-Sum(x-1));
    }
  • 相关阅读:
    【SPOJ1825】Free Tour II-点分治+桶排序
    【BZOJ3238】差异(AHOI2013)-后缀自动机+树形DP
    Vacation
    Function
    Path
    杭电oj初体验之 Code
    挑7
    行游散记!
    坐标移动
    STL之pair类型
  • 原文地址:https://www.cnblogs.com/Profish/p/11163163.html
Copyright © 2011-2022 走看看