题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4143
思路:变方程为n=(y-x)*(y+x)(n>0);令y-x=i,于是有y+x=n/i;从而联立不等式可求的x=(n/i-i)/2(x>0);从而i<=sqrt(n);枚举即可。
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 7 int main(){ 8 int _case,flag,n; 9 scanf("%d",&_case); 10 while(_case--){ 11 scanf("%d",&n); 12 flag=false; 13 for(int i=(int)sqrt(n*1.0);i>=1;i--){ 14 if(n%i==0&&(n/i-i)%2==0){ 15 int x=(n/i-i)/2; 16 if(x>0){flag=true;printf("%d\n",x);break;} 17 } 18 } 19 if(!flag)puts("-1"); 20 } 21 return 0; 22 }