[P4318] 完全平方數

添雅發表於2018-12-28

想不出什麼辦法能直接算的(別跟我提分塊打表),不如二分答案吧:設(f(x)=sum_{i=1}^n [i不是“完全平方數”]), 顯然f(x)與x正相關。再結合篩法、容斥,不難得到:
[
f(x)=sum_{i=1}^{sqrt x } mu(i)lfloorfrac{x}{i^2}
floor
]

找到那個滿足f(x)==k的x就行了。

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N=1e6+10;

int mu[N],pr[N],cnt;
bool vis[N];

void predure() {
    mu[1]=1;
    for(int i=2; i<N; ++i) {
        if(!vis[i]) mu[pr[++cnt]=i]=-1;
        for(int j=1; j<=cnt && i*pr[j]<N; ++j) {
            vis[i*pr[j]]=1;
            if(i%pr[j]==0) break;
            mu[i*pr[j]]=-mu[i];
        }
    }
}
int f(int x) {
    int ret=0;
    for(int i=1; i<=x/i; ++i) {
        ret+=mu[i]*(x/(i*i));
    }
    return ret;
}

signed main() {
    predure();
    int T,k;
    scanf("%lld",&T);
    while(T--) {
        scanf("%lld",&k);
        int l=1,r=k*2,mid,ans;
        while(l<=r) {
            mid=(l+r)>>1;
            if(f(mid)>=k) ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%lld
",ans);
    }
    return 0;
}

相關文章