Problem Description
Given a number x, ask positive integer
y≥2
, that satisfy the following conditions:
1. The absolute value of y - x is minimal
2. To prime factors decomposition of Y, every element factor appears two times exactly.
1. The absolute value of y - x is minimal
2. To prime factors decomposition of Y, every element factor appears two times exactly.
Input
The first line of input is an integer T (
1≤T≤50
)
For each test case,the single line contains, an integer x ( 1≤x≤1018 )
For each test case,the single line contains, an integer x ( 1≤x≤1018 )
Output
For each testcase print the absolute value of y - x
Sample Input
5 1112 4290 8716 9957 9095
Sample Output
23 65 67 244 70
)
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
ll Abs(ll x){
if(x<0) return -x;
return x;
}
bool judge(ll x){
for(ll i=2;i*i<=x;i++){//printf("%lld ",i);
int ans=0;
while(1){
if(x%i==0){
ans++;x/=i;
}
else break;
if(ans>=2) return false;
}
}//printf("%I64d~~~\n",x);
return true;
}
ll b[]={0,3,2,1,0,1,2,2,1,0};
int main(){
int T;
scanf("%d",&T);
while(T--){
ll n,i,j,ans=9999999999;
bool flag=false;
scanf("%I64d",&n);
ll s=sqrt(n);
i=s;j=s+1;
//judge(1089);
if(n<=9)
ans=b[n];
else
while(1){
if(!judge(i)) i--;
else {
ans=min(ans,Abs(i*i-n));flag=true;
}
if(!judge(j)) j++;
else{
ans=min(ans,Abs(j*j-n));flag=true;
}
if(flag) break;
}//printf("%I64d %d %I64d %d\n",i,judge(i),j,judge(j));
printf("%lld\n",ans);
}
return 0;
}