zoukankan      html  css  js  c++  java
  • HDU4145 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;
    }
  • 相关阅读:
    跟我一起写 Makefile
    NFS服务器配置
    q
    tar命令的详细解释
    etc/xinetd.d目录介绍
    ubuntu 10.04下的配置tftp服务器
    莫队板子
    Day8(分块)
    字符串板子
    字符串练习题
  • 原文地址:https://www.cnblogs.com/Lyush/p/2721853.html
Copyright © 2011-2022 走看看