码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 1101: [POI2007]Zap

时间:2019-01-27 22:08:25      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:nbsp   ons   否则   use   ret   决定   problem   bre   mes   

复习

/**************************************************************
    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\n",res);
    }
     
    return 0;
}

 

bzoj 1101: [POI2007]Zap

标签:nbsp   ons   否则   use   ret   决定   problem   bre   mes   

原文地址:https://www.cnblogs.com/lxy8584099/p/10327410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!