bzoj2440 [中山市选2011]完全平方数

网友投稿 662 2022-08-29

bzoj2440 [中山市选2011]完全平方数

bzoj2440 [中山市选2011]完全平方数

​​ Description

小 X 自幼就很喜欢数。但奇怪的是,他十分讨厌完全平方数。他觉得这些 数看起来很令人难受。由此,他也讨厌所有是完全平方数的正整数倍的数。然而 这丝毫不影响他对其他数的热爱。 这天是小X的生日,小 W 想送一个数给他作为生日礼物。当然他不能送一 个小X讨厌的数。他列出了所有小X不讨厌的数,然后选取了第 K个数送给了 小X。小X很开心地收下了。 然而现在小 W 却记不起送给小X的是哪个数了。你能帮他一下吗? Input

包含多组测试数据。文件第一行有一个整数 T,表示测试 数据的组数。 第2 至第T+1 行每行有一个整数Ki,描述一组数据,含义如题目中所描述。 Output

含T 行,分别对每组数据作出回答。第 i 行输出相应的 第Ki 个不是完全平方数的正整数倍的数。 Sample Input 4 1 13 100 1234567 Sample Output 1 19 163 2030745 HINT

对于 100%的数据有 1 ≤ Ki ≤ 10^9

, T ≤ 50 同vijos 1889注意 二分相加会爆Int

#include#include#define N 1100000inline char gc(){ static char now[1<<16],*S,*T; if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;} return *S++;}inline int read(){ int x=0;char ch=gc(); while (ch<'0'||ch>'9') ch=gc(); while (ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=gc();} return x;}int mu[N],prime[N],not_prime[N],T,k,top;inline bool check(int x){ int nn=sqrt(x);long long ans=0,last=0; for (int i=2;i<=nn;i=last+1){ last=sqrt(x/(x/(i*i))); ans+=(mu[last]-mu[i-1])*(x/(i*i)); }return ans+x>=k;}int main(){ freopen("bzoj2440.in","r",stdin); T=read();mu[1]=1; for (int i=2;i<=1e6;++i){ if (!not_prime[i]){ prime[++top]=i;mu[i]=-1; } for (int j=1;prime[j]*i<=1e6;++j){ not_prime[i*prime[j]]=1; if (i%prime[j]==0){ mu[i*prime[j]]=0;break; }mu[i*prime[j]]=-mu[i]; } } for (int i=1;i<=1e6;++i) mu[i]+=mu[i-1]; while (T--){ k=read();int l=1,r=2e9; while (l<=r){ int mid=(long long)l+r>>1; if (check(mid)) r=mid-1;else l=mid+1; } printf("%d\n",l); } return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:loj2555&luogu4602 「CTSC2018」混合果汁
下一篇:PHP实现RabbitMQ消息队列(消息队列RabbitMQ)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~