洛谷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);
}

  

posted @ 2019-02-21 09:08  EM-LGH  阅读(193)  评论(0)    收藏  举报