Hdu 4143


题目链接

好久没有在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\n", ans);
29     }
30 
31     return 0;
32 }

 

 

 

 

posted on 2014-04-04 21:39  Stomach_ache  阅读(135)  评论(0)    收藏  举报

导航