bzoj 2986: Non-Squarefree Numbers (容斥原理)

来源:互联网 发布:中科院的飞箭软件 编辑:程序博客网 时间:2024/05/23 01:13

题目描述

传送门

题目大意:选出第K个有平方因子的数。

题解

之前做过一道基本上一样的题bzoj 完全平方数

代码

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define LL long long #define N 1000000using namespace std;LL n;int pd[N+3],prime[N+3],mu[N+3];void init(){    mu[1]=1;    for (int i=2;i<=N;i++) {        if (!pd[i]) {            prime[++prime[0]]=i;            mu[i]=-1;        }        for (int j=1;j<=prime[0];j++) {            if (i*prime[j]>N) break;            pd[i*prime[j]]=1;            if (i%prime[j]==0) {                mu[i*prime[j]]=0;                break;            }            mu[i*prime[j]]=-mu[i];        }    }}LL check(LL x){    LL ans=0;    for (LL i=2;i*i<=x;i++)      if (mu[i]) ans=ans-mu[i]*(x/(i*i));    return ans;}int main(){//  freopen("a.in","r",stdin);//  freopen("my.out","w",stdout);    init();     scanf("%lld",&n);    LL l=0; LL r=30000000000LL; LL ans=r;     while (l<=r) {        LL mid=(l+r)/2;        if (check(mid)>=n) ans=min(ans,mid),r=mid-1;        else l=mid+1;    }    printf("%lld\n",ans);} 
0 0
原创粉丝点击