BZOJ 2301 Problem b(莫比乌斯函数)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2301

题意:每次给出a,b,c,d,K。求有多少数对(x,y)满足a<=x<=b,c<=y<=d且Gcd(x,y)=K?

思路:

BZOJ 2301 Problem b(莫比乌斯函数)

i64 mou[N];
i64 a,b,c,d,k;

void init()
{
    i64 i,j;
    for(i=2;i<N;i++) if(!mou[i])
    {
        mou[i]=i;
        for(j=i*i;j<N;j+=i) mou[j]=i;
    }
    mou[1]=1;
    for(i=2;i<N;i++)
    {
        if(i/mou[i]%mou[i]==0) mou[i]=0;
        else mou[i]=-mou[i/mou[i]];
    }
    for(i=1;i<N;i++) mou[i]+=mou[i-1];
}

i64 cal(i64 n,i64 m)
{
    n/=k; m/=k;
    if(n>m) swap(n,m);
    int L,R;
    i64 ans=0;
    for(L=1;L<=n;L=R+1)
    {
        R=min(n/(n/L),m/(m/L));
        ans+=(mou[R]-mou[L-1])*(n/L)*(m/L);
    }
    return ans;
}
int main()
{
    init();
    rush()
{
   RD(a,b); RD(c,d); RD(k);
   i64 ans=cal(b,d)-cal(a-1,d)-cal(c-1,b)+cal(a-1,c-1);
   PR(ans);
}
return 0;
}

上一篇:perl 继承概述


下一篇:php yaf框架扩展实践五——数据层