好久没有在Hdu水题了,于是乎在无聊之际还是找了一道水题,
但是看完题目之后,明显是个数学题,我还是感觉有点打触的。
因为一直对数学题没有多大信心。
分析了一下,Y^2 = X^2 + n 可以转化为 Y^2 = (X + a)^2
所以:n = a^2 + 2 * a * X , 而且 X > 0
所以 0 < a <= sqrt(n + 1) - 1
由于要求的是最小的 X, 所以只要逆序枚举 a 就可以了,
这里复杂度为 O(sqrt(n)), 所以可解。
附上代码:
1 #include <cmath> 2 #include <cstdio> 3 4 typedef long long LL; 5 #define min(x, y) ((x) < (y) ? (x) : (y)) 6 7 int main() { 8 int T, n; 9 scanf("%d", &T); 10 while (T--) { 11 scanf("%d", &n); 12 13 int ans = -1; 14 15 int k = int(sqrt(n + 1.0)) - 1; 16 for (int i = k; i > 0; i--) { 17 long long tmp = n - (long long)i * i; 18 if (tmp % (2 * i)) 19 continue; 20 else { 21 if (ans == -1) 22 ans = tmp / (2 * i); 23 else 24 ans = min(ans, tmp / (2 * i)); 25 break; 26 } 27 } 28 printf("%d ", ans); 29 } 30 31 return 0; 32 }