bzoj1101Zap(莫比乌斯反演入门)

题目
bzoj1101Zap(莫比乌斯反演入门)_第1张图片

#include
#include
#include
using namespace std;
typedef long long ll;
const int N=5e4+5;
int is[N],prime[N],mu[N],sum[N];
void Moblus()
{
     
    mu[1]=1;int tot=0;
    for(int i=2;i<=N-5;++i)
    {
     
        if(!is[i]) prime[++tot]=i,mu[i]=-1;
        for(int j=1;j<=tot&&(ll)i*prime[j]<=N-5;++j)
        {
     
            int t=i*prime[j];is[t]=1;
            if(i%prime[j]==0) {
     mu[t]=0;break;}
            mu[t]=-mu[i];
        }
    }
    for(int i=1;i<=N-5;++i) sum[i]=sum[i-1]+mu[i];
}
int main()
{
     
    Moblus();
    int T;scanf("%d",&T);
    while(T--)
    {
     
        int a,b,d;scanf("%d%d%d",&a,&b,&d);
        a/=d,b/=d;
        if(a>b) swap(a,b);
        int las;ll ans=0;
        for(int i=1;i<=a;i=las+1)
        {
     
            las=min(a/(a/i),b/(b/i));
            ans+=(ll)(sum[las]-sum[i-1])*(a/i)*(b/i);
        }
        printf("%lld\n",ans);
    }
}

你可能感兴趣的:(数学==莫比乌斯反演)