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

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=6e6+50;
    unordered_map<int,int>m;
    unordered_map<ll,ll>p;
    bool vis[maxn];
    int mu[maxn],sum_mu[maxn],phi[maxn];
    ll sum_phi[maxn];
    int cnt,prime[maxn];
    
    void init(int N){
        phi[1]=mu[1]=1;
        for(int i=2;i<=N;i++){
            if(!vis[i]){
                prime[++cnt]=i;
                mu[i]=-1;phi[i]=i-1;
            }
            for(int j=1;j<=cnt;j++){
                if(i*prime[j]>N)break;
                vis[i*prime[j]]=true;
                if(i%prime[j]==0){
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
                mu[i*prime[j]]=-mu[i];
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
        for(int i=1;i<=N;i++){
            sum_mu[i]=sum_mu[i-1]+mu[i];
            sum_phi[i]=sum_phi[i-1]+phi[i];
        }
    }
    int getmu(int x){
        if(x<=6e6)return sum_mu[x];
        if(m[x])return m[x];
        int ans=1;
        for(int l=2,r;l<=x;l=r+1){
            r=x/(x/l);
            ans-=(r-l+1)*getmu(x/l);
        }
        return m[x]=ans;
    }
    ll getphi(ll x){
        if(x<=6e6)return sum_phi[x];
        if(p[x])return p[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)*getphi(x/l);
    
        }
        return p[x]=ans;
    }
    int main(){
        int t,n;
        cin>>t;
        init(6e6);
        while(t--){
            cin>>n;
            cout<<getphi(n)<<" "<<getmu(n)<<endl;
        }
    	return 0;
    }
    
    
  • 相关阅读:
    EF
    采用什么架构,才能够承受大访问量
    13个MVC的扩展
    c#与.NET的区别
    整合Spring.net到asp.net网站开发中初探
    C#多线程编程简述
    ASP.NET页面传值的几种方式
    正则RegEXp
    C#中Cache用法
    c#程序将excel文件转换成xml文件
  • 原文地址:https://www.cnblogs.com/luowentao/p/10603177.html
Copyright © 2011-2022 走看看