#include<iostream> using namespace std; //求第ki的无平方因子数1<=ki<=10e9 //在2*ki+1的范围内必定能找到第ki个无平方因子数 //故莫比乌斯反演函数的自变量的范围为sqrt(2*ki+1)=10e5 #define N 100007 int prime[N]; int primesize; int flag[N]; int u[N]; void get_prime(int x) { u[1]=1; for(int i=2;i<=x;++i) { if(flag[i]==0) { prime[primesize++]=i; u[i]=-1; } for(int j=0;j<primesize;++j) { if(i*prime[j]>x) break; flag[i*prime[j]]=1; if(i%prime[j]==0) break; else u[i*prime[j]]=-u[i]; } } } long long cal(long long x) { long long ans=0; for(int i=1;i*i<=x;++i) { ans+=u[i]*(x/(i*i));//莫比乌斯函数*个数 } return ans; } int main() { get_prime(100000); int ki; while(cin>>ki) { long long l=1,r=2*ki+1; while(l<r)//二分 { long long mid=(l+r)>>1; if(cal(mid)<ki) l=mid+1; else r=mid; } cout<<l<<endl; } return 0; }
第KI个无平方因子数
猜你喜欢
转载自blog.csdn.net/qq_36921652/article/details/80526901
今日推荐
周排行