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

bzoj2440 [中山市选2011]完全平方数 莫比乌斯函数应用

时间:2018-01-22 11:02:33      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:ems   ble   zoj   ace   二分   应用   else   lld   ++   

先用二分把问题转化一下,然后利用容斥定理和莫比乌斯函数搞一搞就好了。

/**************************************************************
    Problem: 2440
    User: mybing
    Language: C++
    Result: Accepted
    Time:4908 ms
    Memory:2556 kb
****************************************************************/
 
#include<bits/stdc++.h>
using namespace std;
int f[100010],tot=0,prime[100010],mu[100010],T,n;
 
bool not_prime[100010];
bool pd(long long p,long long w)
{
    long long sum=0;
    for(long long i=1;i*i<=p;i++)
    {
        sum+=p/(i*i)*mu[i];
    }
    if(sum>=w)return true;
    else return false;
}
void work(int p)
{
    long long l=1,r=3000000000;
    while(l+1<r)
    {
        long long mid=(l+r)>>1;
        if(pd(mid,(long long)p))r=mid;
        else l=mid;
    }
    if(pd(l,n))printf("%lld\n",l);
    else printf("%lld\n",r);
}
int main()
{
    memset(not_prime,true,sizeof(not_prime));
    mu[1]=1;
    for(int i=2;i<=100000;i++)
    {
        if(not_prime[i])
        {
            prime[++tot]=i;
            mu[i]=-1;
        }
        for(int j=1;j<=tot&&i*prime[j]<=100000;j++)
        {
            not_prime[i*prime[j]]=false;
            if(i%prime[j]==0)
            {
                not_prime[prime[j]*i]=false;
                mu[prime[j]*i]=0;
                break;
            }
            mu[i*prime[j]]=-1*mu[i];
        }
    }
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        work(n);
    }
    return 0;
}

  

bzoj2440 [中山市选2011]完全平方数 莫比乌斯函数应用

标签:ems   ble   zoj   ace   二分   应用   else   lld   ++   

原文地址:https://www.cnblogs.com/mybing/p/8327602.html

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