[BZOJ2440]完全平方数

题目

传送门 to VJ

题目概要
求这个集合中第 kk 小的值:{xZμ(x)0,x1}\big\{x\in\Z\big|\mu(x)\ne 0,x\ne 1\big\}

数据范围与约定
数据组数 T50T\le 50k109k\le 10^9

思路

其实蛮简单一道题? 我一开始想,每个质因数的指数不超过 11 ,那么最多只需要 3030 个质数。于是我把最小的 3030 个质数乘起来,发现爆 long  longlong\;long 了,以为不可做……

仔细想想,只用前 3030 个质数固然可以凑出 kk 个数,但是使用其他的质数,也可以得到一些数字,并且比只用前 3030 个质数的最大数更小。用一个非常粗略的估计:xx 以内的质数个数约为 xlnx\frac{x}{\ln x} ,在这个值大于 10910^9 的时候,就一定可行了。x=1011x=10^{11} 时,已经满足,显然真正的第 10910^9 个数会小很多。

既然上界是有限的,就可以进行二分。既然不能含有平方因子,就直接做容斥,p1Pnp12p1,p2Pnp12p22+\sum_{p_1\in P}\left\lfloor\frac{n}{p_1^2}\right\rfloor-\sum_{p_1,p_2\in P}\left\lfloor\frac{n}{p_1^2p_2^2}\right\rfloor+\cdots

就可以用到 μ\mu 了,可以写成 x=2+μ(x)nx2\sum_{x=2}^{+\infty}\mu(x)\left\lfloor\frac{n}{x^2}\right\rfloor

复杂度就是 O(nlogn)\mathcal O(\sqrt{n}\log n)nn 是答案。

代码

这位召唤师设置了查阅权限哦~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章