bzoj 1101: [POI2007]Zap

Posted lxy8584099

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 1101: [POI2007]Zap相关的知识,希望对你有一定的参考价值。

复习

/**************************************************************
    Problem: 1101
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:6736 ms
    Memory:1456 kb
****************************************************************/
 
/*
    莫比乌斯反演 + 整除分块 
    sigma ( mu(k)*(n/d/k)*(m/d/k) ) 
    mu(i) 由i的质因子决定 
    由俩及以上相同质因子 mu=0
    否则 mu=(-1)^质因子个数 
*/
#include<cstdio>
using namespace std;
const int N=5e4+50;
int pri[N],mu[N],s[N];
bool vis[N];
int min(int a,int b) {return a>b?b:a;} 
void pre()
{
    mu[1]=1;for(int i=2;i<=50000;i++)
    {
        if(!vis[i]) pri[++pri[0]]=i,mu[i]=-1;
        for(int j=1;j<=pri[0];j++)
        {
            if(i*pri[j]>50000) break;
            vis[i*pri[j]]=1;mu[i*pri[j]]=-mu[i];
            if(i%pri[j]==0) {mu[i*pri[j]]=0;break;} 
        }
    }
    for(int i=2;i<=50000;i++) mu[i]+=mu[i-1];
}
int main()
{
    pre();
    int T;scanf("%d",&T);while(T--)
    {
        int n,m,d,L=1,R;long long res=0;
        scanf("%d%d%d",&n,&m,&d);
        n/=d;m/=d;if(n>m) n^=m^=n^=m;
        for(;L<=n;L=R+1)
        {
            R=min(n/(n/L),m/(m/L));
            res+=1LL*(mu[R]-mu[L-1])*(n/L)*(m/L);
        }
        printf("%lld
",res);
    }
     
    return 0;
}

 

以上是关于bzoj 1101: [POI2007]Zap的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ1101][POI2007]Zap

BZOJ1101: [POI2007]Zap(莫比乌斯反演)

bzoj 1101: [POI2007]Zap

BZOJ 1101 [POI2007]Zap

Bzoj1101 [POI2007]Zap

Poi2007Bzoj1101Zap