B - Coprime Integers Gym - 101982B 莫比烏斯板子題

題目鏈接:http://codeforces.com/gym/101982

 

題意:

         x\epsilon [a,b],y\epsilon [c,d],求gcd(x,y)=1的對數

做法:

        莫比烏斯函數,貼個鏈接。。

         https://blog.csdn.net/jk_chen_acmer/article/details/82016719

 

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=10000005;
const ll maxm=664800;
ll a,b,c,d,minn,f[maxn];
ll prime[maxm],numprime,mobi[maxn];
bool vis[maxn];
void initmob(){//莫比烏斯反演
    minn=min(b,d);
    for(ll i=1;i<=minn;i++){
        f[i]=((b/i)-(a-1)/i)*((d/i)-(c-1)/i);
    }

    mobi[1]=1;
    for(int i=2;i<maxn;i++){
        if(!vis[i]){
            prime[++numprime]=i;
            mobi[i]=-1;
        }
        for(ll j=1;j<=numprime&&(ll)i*prime[j]<maxn;j++){
            vis[prime[j]*i]=1;
            if(i%prime[j]==0){
                mobi[i*prime[j]]=0;
                break;
            }
            mobi[prime[j]*i]=-mobi[i];
        }
    }
}

int main(){
    scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
    initmob();
    ll ans=0;
    for(int i=1;i<=minn;i++){
        ans=(ans+mobi[i]*f[i]);
    }
    printf("%lld\n",ans);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章