hdu_5778_abs(暴力)

时间:2021-05-01 09:12:59

题目链接:hdu_5778_abs

题意:

给你一个数x,然你找一个y,这个y只能被素数分解,每一个素数恰好出现2次,求y-x的绝对值最小

题解:

给官方的  ps:数据太水,打35个素数也能过

hdu_5778_abs(暴力)

 #include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
typedef long long ll;
const int E_N=;
int p[E_N],tot;
bool vis[E_N+];
void Euler(){
F(i,,E_N){
if(!vis[i])p[++tot]=i;
F(j,,tot){
if(i*p[j]>E_N)break;
vis[i*p[j]]=;
if(i%p[j]==)break;
}
}
} bool check(int x)
{
for(int i=;i<=tot&&p[i]*p[i]<x;i++)if(x%p[i]==)
{
x/=p[i];
if(x%p[i]==)return ;
}
return ;
} int main(){
Euler();
int t;scanf("%d",&t);
while(t--)
{
ll n,ans;
scanf("%lld",&n);
int tmp=(ll)sqrt(n+0.5);
if(tmp<){printf("%lld\n",4ll-n);continue;}
for(int i=tmp;i>=;i--)
if(check(i)){ans=abs(1ll*i*i-n);break;}
for(int i=tmp+;;i++)
if(check(i)){ans=min(ans,abs(1ll*i*i-n));break;}
printf("%lld\n",ans);
}
return ;
}