您的位置:首页 > 其它

HDU-4145 A Simple Problem 简单数论

2012-10-12 19:59 435 查看
这题给定一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: