HDU-4145 A Simple Problem 简单数论
这题给定一个N,求最小的x^2满足y^2 = x^2 + N;
将x^2移到左边,得到(y+x)*(y-x) = N,于是我们分解N成两个约数相乘的形式,于是我们从sqrt(N)到1开始枚举约数,得到可以相除的约数对(a, b)后,直接计算abs((a-b) / 2)就是x的值了,当然x不能为零,并且a,b的奇偶性要一致。
代码如下:
#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cmath> #include<queue> #include<set> #include<map> #include<cstring> #include<vector> #include<string> #define LL long long using namespace std; int N; int main() { int T, ret; scanf("%d", &T); while (T--) { scanf("%d", &N); ret = -1; int LIM = (int)sqrt(double(N)); for (int i = LIM; i >= 1; --i) { if (N % i == 0) { if ((i & 1) ^ ((N/i) & 1)) { continue; } else if (i - N/i){ ret = abs((i - N/i) / 2); break; } } } printf("%d\n", ret); } return 0; }