链接:http://acm.hdu.edu.cn/showproblem.php?pid=5778
题解:由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求
#include <bits/stdc++.h>
using namespace std;
#define bug cout<<"bug"<<endl
#define INF 0x3f3f3f3f
#define mod 1000000007
const int maxn = 1e5+7;
bool Div(long long n)
{
for(long long i=2; i*i<=n; ++i)
{
int flag=0;
while(n%i==0)
{
flag++;n/=i;
}
if(flag>1)return 0;
}
return 1;
}
int main()
{
int T;
long long n,m;
cin>>T;
while(T--)
{
scanf("%I64d",&n);
if(n<=4){cout<<4-n<<endl;continue;}
m=sqrt(n);
int i=0;
long long poi,temp,ans;
while(1)
{
poi=m+i;
i++;
if(poi*poi>=n && Div(poi))
{
i=0;ans=poi*poi-n;break;
}
}
poi=m;
while(1)
{
poi=m-i;
i++;
if(poi*poi<n && Div(poi))
{
ans=min(ans,n-poi*poi);break;
}
}
cout<<ans<<endl;
}
}
/*
5
1112
4290
8716
9957
9095
*/