题目链接: http://codeforces.com/group/NVaJtLaLjS/contest/242322
题意: 求x
(a,b)到与y
(c,d)的gcd(x,y)==1的个数
思路: 直接套莫比乌斯模板,注意容斥一下就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+5;
bool check[maxn];
int prime[maxn];
int mu[maxn];
void get_mo()
{
mu[1]=1;
int cnt=0;
for(int i=2;i<maxn;i++)
{
if(!check[i])
{
prime[cnt++]=i;
mu[i]=-1;
}
for(int j=0;j<cnt;j++)
{
if(i*prime[j]>maxn)
break;
check[i*prime[j]]=true;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
else
{
mu[i*prime[j]]=-mu[i];
}
}
}
for(int i=1;i<maxn;i++)
{
mu[i]+=mu[i-1];
}
}
ll sl(int x,int y)
{
if(x>y)
swap(x,y);
ll ans=0;
for(int i=1,last;i<=x;i=last+1)
{
last=min(x/(x/i),y/(y/i));
ans+=1ll*(mu[last]-mu[i-1])*(x/i)*(y/i);
}
return ans;
}
int main()
{
get_mo();
int a,b,c,d;
cin>>a>>b>>c>>d;
ll ans=sl(b,d)-sl(a-1,d)-sl(c-1,b)+sl(a-1,c-1);
cout<<ans<<endl;
return 0;
}