0
点赞
收藏
分享

微信扫一扫

洛谷P4450 双亲数 莫比乌斯反演

求 $\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)==k]$

莫比乌斯反演板子题,直接反演即可. 

#include <cstdio>
#include <algorithm>
using namespace std;

long long mobius[1000001],A,B,d,prime[1000001],tot,ans;
bool check[1000001];
int main(){
scanf("%lld%lld%lld",&A,&B,&d);
mobius[1]=1;
A/=d;
B/=d;
if(A>B)swap(A,B);
for(register int i=2;i<=A;i++){
if(!check[i]){
mobius[i]=-1;
prime[++tot]=i;
}
for(register int j=1;j<=tot;j++){
if(i*prime[j]>A)break;
check[i*prime[j]]=1;
if(i%prime[j]==0){
mobius[i*prime[j]]=0;
break;
}
mobius[i*prime[j]]=-mobius[i];
}
}
for(register int i=2;i<=A;i++)mobius[i]+=mobius[i-1];
for(register int i=1,j;i<=A;i=j+1)
{
j=min(A/(A/i),B/(B/i));
ans+=(A/i)*(B/i)*(mobius[j]-mobius[i-1]);
}
printf("%lld",ans);
}





举报

相关推荐

0 条评论