超级传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=4143
由于数据范围很大(1<=n <= 10^9),所以直接暴力必然TLE,考虑因式分解y^2 = n +x^2,平方差公式得:(y-x)*(y+x)=n
接下来要做的就是把n因式分解,由于x不能为零(原文:please find the smallest positive integer x),故分解出来的两个因子必然不同,而且相差为2的倍数。然后接下来要做的就是找满足题意的最小x,这个只要从sqrt(n)开始找,一直到1,最先找到的肯定x最小。
#include<stdio.h>
#include<math.h>
int main () {
int t,ok,i;
long long n,k;
while (scanf("%d",&t) != EOF) {
while (t--) {
scanf("%lld",&n);
ok = 0;
if (n!=2) for (i=(int)sqrt(n);i>=1;i--) {
if (n%i==0 && i!=n/i && abs(i-n/i)%2==0) {
k = abs(i-n/i)/2;
printf("%lld\n",k);
ok = 1;
break;
}
}
if (!ok) printf("-1\n");
}
}
return 0;
}