題目鏈接:http://codeforces.com/gym/101982
題意:
,求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;
}