题目
传送门 to VJ
题目概要
求这个集合中第 k 小的值:{x∈Z∣∣μ(x)=0,x=1}
数据范围与约定
数据组数 T≤50 ,k≤109 。
思路
其实蛮简单一道题? 我一开始想,每个质因数的指数不超过 1 ,那么最多只需要 30 个质数。于是我把最小的 30 个质数乘起来,发现爆 longlong 了,以为不可做……
仔细想想,只用前 30 个质数固然可以凑出 k 个数,但是使用其他的质数,也可以得到一些数字,并且比只用前 30 个质数的最大数更小。用一个非常粗略的估计:x 以内的质数个数约为 lnxx ,在这个值大于 109 的时候,就一定可行了。x=1011 时,已经满足,显然真正的第 109 个数会小很多。
既然上界是有限的,就可以进行二分。既然不能含有平方因子,就直接做容斥,p1∈P∑⌊p12n⌋−p1,p2∈P∑⌊p12p22n⌋+⋯
就可以用到 μ 了,可以写成 x=2∑+∞μ(x)⌊x2n⌋
复杂度就是 O(nlogn) ,n 是答案。
代码
这位召唤师设置了查阅权限哦~