HDU-5778 abs(数论)

来源:互联网 发布:第八届中国云计算大会 编辑:程序博客网 时间:2024/05/17 03:04


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 y2, 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.
 

Input
The first line of input is an integer T ( 1T50)
For each test case,the single line contains, an integer x ( 1x1018)
 

Output
For each testcase print the absolute value of y - x
 

Sample Input
511124290871699579095
 

Sample Output
23656724470
 

   思路:由于y质因数分解式中每个质因数均出现2次,那么y是一个完全平方数,设y=z*z,题目可转换成求z,使得每个质因数出现1次. 我们可以暴力枚举z,检查z是否符合要求,显然当z是质数是符合要求,由素数定理可以得,z的枚举量在logn级别 复杂度 O(\sqrt[4]{n}log\sqrt[2]{n}4nlog2n

#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);    }   }


1 0