• yy的gcd


    yy的gcd

    题意

    给定 (N) , (M) , 求 (1 leq x leq N) , (1 leq y leq M)(gcd(x, y)) 为质数的 ((x, y)) 有多少对

    解法

    我是参照 这位爷 写出来的。

    我们设:
    (f(p) = sum _{x=1} ^{n} sum _{y=1} ^{m} [ gcd(x,y) == p ])
    (F(d)) 表示 (d|gcd(x,y))(1 leq x leq N)(1 leq y leq M)((x,y)) 对数。
    容易知道:
    (F(d) = [ frac{n}{d} ] [ frac{m}{d} ])(F(n) = sum _{n|p} f(p))
    由莫比乌斯反演有:
    $f(n) = sum _{n|d} mu( frac {d}{n} )F(d) ( 所以答案为: )ans = sum _{p} sum _{p|d} mu( frac {d}{p} )[ frac{n}{d} ] [ frac{m}{d} ]$
    我们枚举 $ frac {d}{p}$ 则有:
    (ans = sum _{p} sum _{d=1} ^{min([frac {n}{d}],[frac {m}{d}])} mu( d )[ frac{n}{dp} ] [ frac{m}{dp} ])
    (dp = T) 有:
    (ans = sum _{T=1} ^{min(n,m)} [ frac{n}{T} ] [ frac{m}{T} ] ( sum _{t|T} mu( [frac{T}{t}] ) ))
    然后就完了。
    代码如下:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #define INF 2139062143
    #define MAX 0x7ffffffffffffff
    #define del(a,b) memset(a,b,sizeof(a))
    #define Rint register int
    using namespace std;
    typedef long long ll;
    template<typename T>
    inline void read(T&x)
    {
        x=0;T k=1;char c=getchar();
        while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}
        while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
    }
    const int maxn=10000000+10;
    int mo[maxn];
    bool nop[maxn];
    int p[maxn];
    ll sum[maxn];
    int g[maxn];
    void get_mo(int n){
        mo[1]=1;
        nop[1]=1;
        for(int i=2;i<=n;i++){
            if(!nop[i]) {
                p[++p[0]]=i;
                mo[i]=-1;
            }
            for(int j=1;j<=p[0]&&i*p[j]<=n;j++){
                nop[i*p[j]]=1;
                if(i%p[j]==0) break;
                mo[i*p[j]]=-mo[i];
            }
        }
        for(int j=1;j<=p[0];j++)
            for(int i=1;i*p[j]<=n;i++) g[i*p[j]]+=mo[i];
        for(int i=1;i<=n;i++) sum[i]=sum[i-1]+1ll*g[i];
    }
    
    int main()
    {
        get_mo(10000000);
        int t;
        read(t);
        while(t--){
            ll n,m,limit;
            ll ans=0;
            read(n),read(m);
            limit=min(n,m);
            for(int l=1,r;l<=limit;l=r+1){
                r=min( n/(n/l) , m/(m/l) );
                ans += (n/l) * (m/l) * (sum[r]-sum[l-1]);
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
    
  • 相关阅读:
    题解【luogu1073 最优贸易】
    题解【luogu4145 上帝造题的七分钟2(花神游历各国)】
    题解【bzoj2427 [HAOI2010]软件安装】
    以后会经常用cnblogs啦!
    题解【luogu4168 [Violet]蒲公英】
    题解【bzoj1010 [HNOI2008]玩具装箱TOY】
    题解【bzoj4653 [NOI2016] 区间】
    animation渐进实现点点点等待效果
    纯css loading动效
    文字和背景渐变动效
  • 原文地址:https://www.cnblogs.com/mrasd/p/9509310.html
Copyright © 2020-2023  润新知