• 洛谷试炼场 4-23 莫比乌斯反演



    layout: post
    title: 洛谷试炼场 4-23 莫比乌斯反演
    author: "luowentaoaa"
    catalog: true
    mathjax: true
    tags:
    - 莫比乌斯反演
    - 数论
    - 洛谷


    P2257 YY的GCD

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=998244353;
    const int maxn=1e7+50;
    const ll inf=0x3f3f3f3f3f3f3f3fLL;
    bool vis[maxn];
    ll sum[maxn];
    int prim[maxn];
    int mu[maxn],g[maxn];
    int cnt;
    void get_mu(int n){
        mu[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!vis[i]){mu[i]=-1;prim[++cnt]=i;}
            for(int j=1;j<=cnt&&prim[j]*i<=n;j++)
            {
                vis[i*prim[j]]=1;
                if(i%prim[j]==0)break;
                else mu[prim[j]*i]=-mu[i];
            }
        }
        for(int j=1;j<=cnt;j++)
            for(int i=1;i*prim[j]<=n;i++)g[i*prim[j]]+=mu[i];
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+g[i];
    }
    int main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        std::cout.tie(0);
        get_mu(10000000);
        int t;
        cin>>t;
        while(t--){
            int n,m;
            cin>>n>>m;
            if(n>m)swap(n,m);
            ll ans=0;
            for(int l=1,r;l<=n;l=r+1){
                r=min(n/(n/l),m/(m/l));
                ans+=1LL*(n/l)*(m/l)*(sum[r]-sum[l-1]);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
    

    [POI2007]ZAP-Queries

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=998244353;
    const int maxn=1e5+50;
    const ll inf=0x3f3f3f3f3f3f3f3fLL;
    bool vis[maxn];
    ll sum[maxn];
    int prim[maxn];
    int mu[maxn],g[maxn];
    int cnt;
    void get_mu(int n){
        mu[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!vis[i]){mu[i]=-1;prim[++cnt]=i;}
            for(int j=1;j<=cnt&&prim[j]*i<=n;j++)
            {
                vis[i*prim[j]]=1;
                if(i%prim[j]==0)break;
                else mu[prim[j]*i]=-mu[i];
            }
        }
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+mu[i];
    }
    int main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        std::cout.tie(0);
        get_mu(50000);
        int t;
        cin>>t;
        while(t--){
            int a,b,d;
            cin>>a>>b>>d;
            int mx=min(a/d,b/d);
            ll ans=0;
            for(int l=1,r;l<=mx;l=r+1){
                r=min((a/d)/((a/d)/l),(b/d)/((b/d)/l));
                ans+=(ll)((a/d)/l)*((b/d)/l)*(sum[r]-sum[l-1]);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
    

    P3327 [SDOI2015]约数个数和

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=998244353;
    const int maxn=1e5+50;
    const ll inf=0x3f3f3f3f3f3f3f3fLL;
    bool vis[maxn];
    ll sum[maxn];
    int prim[maxn];
    int mu[maxn];
    ll g[maxn];
    int cnt;
    void get_mu(int n){
        mu[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!vis[i]){mu[i]=-1;prim[++cnt]=i;}
            for(int j=1;j<=cnt&&prim[j]*i<=n;j++)
            {
                vis[i*prim[j]]=1;
                if(i%prim[j]==0)break;
                else mu[prim[j]*i]=-mu[i];
            }
        }
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+mu[i];
        for(int i=1;i<=n;i++){
            ll ans=0;
            for(int l=1,r;l<=i;l=r+1){
                r=(i/(i/l));
                ans+=1LL*(r-l+1)*1LL*(i/l);
            }
            g[i]=ans;
        }
    }
    int main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        std::cout.tie(0);
        get_mu(50000);
        int t;
        cin>>t;
        while(t--){
            int n,m;
            cin>>n>>m;
            int mx=min(n,m);
            ll ans=0;
            for(int l=1,r;l<=mx;l=r+1){
                r=min(n/(n/l),m/(m/l));
                ans+=(1LL*g[n/l]*1LL*g[m/l])*1LL*(sum[r]-sum[l-1]);
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
    

    [P2522 HAOI2011]Problem b

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll mod=998244353;
    const int maxn=1e5+50;
    const ll inf=0x3f3f3f3f3f3f3f3fLL;
    bool vis[maxn];
    ll sum[maxn];
    int prim[maxn];
    int mu[maxn];
    ll g[maxn];
    int cnt;
    int k;
    void get_mu(int n){
        mu[1]=1;
        for(int i=2;i<=n;i++)
        {
            if(!vis[i]){mu[i]=-1;prim[++cnt]=i;}
            for(int j=1;j<=cnt&&prim[j]*i<=n;j++)
            {
                vis[i*prim[j]]=1;
                if(i%prim[j]==0)break;
                else mu[prim[j]*i]=-mu[i];
            }
        }
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+mu[i];
    }
    ll get(int a,int b){
        int mx=min(a,b);
        ll ans=0;
        for(int l=1,r;l<=mx;l=r+1){
            r=min(a/(a/l),b/(b/l));
            ans+=(1ll*a/(1ll*l*k))*(1ll*b/(1ll*l*k))*(sum[r]-sum[l-1]);
        }
        return ans;
    }
    // 适用于正负整数
    template <class T>
    inline bool read(T &ret)
    {
        char c;
        int sgn;
        if (c = getchar(), c == EOF) return 0; //EOF
        while (c != '-' && (c < '0' || c > '9')) c = getchar();
        sgn = (c == '-') ? -1 : 1;
        ret = (c == '-') ? 0 : (c - '0');
        while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
        ret *= sgn;
        return 1;
    }
    inline void out(ll x)
    {
        if (x > 9) out(x / 10);
        putchar(x % 10 + '0');
    }
    int main()
    {
       /* std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        std::cout.tie(0);*/
        get_mu(50000);
        int t;
        //cin>>t;
        read(t);
        while(t--){
            int a,b,c,d;
           // cin>>a>>b>>c>>d>>k;
           read(a);read(b);read(c);read(d);read(k);
            out(get(b,d)-get(b,c-1)-get(a-1,d)+get(a-1,c-1));
            puts("");
        }
        return 0;
    }
    
    
  • 相关阅读:
    每天一个linux命令(1):man命令
    安卓名词积累
    每天一个Linux命令:目录
    ubuntu下Python的安装和使用
    嵌入式基础知识(1):存储
    2月份学习笔记
    AndroidStudio 中的坑Error:(1, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRID
    AndroidStudio开发出现Warning:Gradle version 2.10 is required. Current version is 2.8. If u
    Git 问题
    判断年 月的值
  • 原文地址:https://www.cnblogs.com/luowentao/p/10372389.html
Copyright © 2020-2023  润新知