A Simple Problem
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
For a given positive integer n, please find the smallest positive integer x that we can find an integer y such that
y^2 = n +x^2.
-
输入
-
The first line is an integer T, which is the the number of cases.
Then T line followed each containing an integer n (1<=n <= 10^9).
输出
- For each integer n, please print output the x in a single line, if x does not exit , print -1 instead. 样例输入
-
2 2 3
样例输出
-
-1 1
上传者
解题思路:
由y^2=n+x^2,可得: y^2-x^2=n,即为:(y+x)(y-x)=n,
所以(y+x)与(y-x)都为n的因子。
因为(y+x)>(y-x),则在下代码中,当 i 为 n 因子时,有 i < n / i,
所以有:
y+x=n/i
y-x=i
联立方程有:x=(n/i-i)/2.
代码如下:
#include <iostream> #include <cmath> using namespace std; int main() { int t; cin>>t; while(t--) { int n; cin>>n; int d=sqrt(n); int i=d; for(;i>=1;i--) { if(n%i==0&&(n/i!=i)&&((n/i-i)%2==0)) { cout<<(n/i-i)/2<<endl; break; } } if(!i) cout<<"-1"<<endl; } }
-
The first line is an integer T, which is the the number of cases.