【二分+莫比烏斯函數】BZOJ2440 [中山市選2011]完全平方數

題面在這裏

顯然需要二分……

問題轉化爲求[1,n] 中無平方因子數的個數

根據容斥原理,顯然答案爲n+

如果枚舉這個乘積i,根據莫比烏斯函數的定義,答案爲:

i=1nμ(i)ni2

然後就好了

示例程序:

#include<cstdio>
#include<cmath>
typedef long long ll;

const int maxn=100000;
int m=maxn-5,mu[maxn],p[maxn];
bool vis[maxn];
ll tst,L,R,K,ans;
void get_mu(){
    mu[1]=1;
    for (int i=2;i<=m;i++){
        if (!vis[i]) p[++p[0]]=i,mu[i]=-1;
        for (int j=1;j<=p[0]&&i*p[j]<=m;j++){
            vis[i*p[j]]=1;
            if (i%p[j]==0){mu[i*p[j]]=0;break;}
             else mu[i*p[j]]=-mu[i];
        }
    }
}
bool check(ll mid){
    ll sm=sqrt(mid),res=0;
    for (ll i=1;i<=sm;i++) res+=mu[i]*(mid/(i*i));
    return res>=K;
}
int main(){
    scanf("%lld",&tst);
    get_mu();
    while (tst--){
        scanf("%lld",&K);
        ans=0;L=1,R=1e10;
        while (L<=R){
            ll mid=L+R>>1;
            if (check(mid)) R=mid-1,ans=mid;else L=mid+1;
        }
        printf("%lld\n",ans);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章