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;
}

 

posted @ 2012-10-12 19:59  沐阳  阅读(353)  评论(0编辑  收藏  举报