hdu 4143

题目链接: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 }
原文地址:https://www.cnblogs.com/wally/p/3060554.html