abs
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1163 Accepted Submission(s): 407
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
思路:由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求,显然当z是质数是符合要求,由素数定理可以得,z的枚举量在logn级别 复杂度 O(4√nlog2√n)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<limits.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
#define maxn 100005
__int64 a[maxn]={1,1};
__int64 b[maxn];
__int64 ans=-1;
__int64 n,x;
long long Abs(long long a)
{
if(a<0)
return -a;
return a;
}
int main()
{
long long i,j,T;
for(i=2;i<=100000;i++)
{
if(a[i])
continue;
for(j=i*i;j<=100000 && j>0;j+=i)
a[j]=1;
}
__int64 k=0;
for(i=2;i<=100000;i++)
if(!a[i])
b[++k]=i;
scanf("%I64d",&T);
while(T--)
{
long long tt;
ans=-1;
int flag;
scanf("%I64d",&n);
x=(long long)sqrt(n);
for(i=x;i<=500+x;i++)
{
if(Abs(n-i*i)>ans && ans!=-1)
break;
tt=i;
for(j=1;j<=k;j++)
{
if(tt%b[j]==0)
{
tt/=b[j];
if(tt%b[j]==0)
break;
}
}
if(ans==-1 && j==k+1)
ans=Abs(n-i*i);
else if(j==k+1 && ans!=-1)
ans=min(ans,Abs(n-i*i));
}
for(i=x;i>=x-500;i--)
{
if(Abs(n-i*i)>ans && ans!=-1)
break;
tt=i;
for(j=1;j<=k;j++)
{
if(tt%b[j]==0)
{
tt/=b[j];
if(tt%b[j]==0)
break;
}
}
if(ans==-1 && j==k+1)
ans=Abs(n-i*i);
else if(j==k+1 && ans!=-1)
ans=min(ans,Abs(n-i*i));
}
if(n==1)
printf("3\n");
else if(n==2)
printf("2\n");
else
printf("%I64d\n",ans);
}
}