题解:P4318 完全平方数
threediamond · · 题解
题目传送门
1.题目大意:
别看题目说的那么长,其实主要意思就是的求第
2.题目思路:
主要思路:容斥原理+二分答案
我们为什么能够二分答案?
我们通过样例可以得出我们实际上就是要求出一个最小
所以现在问题就转移到了如何求出
容斥原理
我们可以发现在
因为这样的时间复杂度较高,所以我们只需要判断
#include<bits/stdc++.h>
using namespace std;
long long t,k,phi[45010];
long long work(long long x){
long long cnt=0;
for(int i=2;i<=sqrt(x);i++){
cnt+=phi[i]*(x/(i*i));
}
return cnt;
}
int main(){
scanf("%lld",&t);
for(int i=2;i<=45000;i++){//判断它是加还是减还是不计算
long long cnt=0,s=0,a=i;
for(int j=2;j<=sqrt(i);j++){
long long js=0;
while(a%j==0){
a/=j;
js++;
}
cnt+=js;
if(js>1){
s=1;
break;
}
}
if(a>1)cnt++;
if(s==1)continue;
if(cnt%2==0)phi[i]=-1;
else phi[i]=1;
}
while(t--){//二分
scanf("%lld",&k);
long long l=1,r=2e9,ans;
while(l<=r){
long long mid=(l+r)/2;
if(mid-work(mid)>=k){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%lld\n",ans);
}
return 0;
}