zoukankan      html  css  js  c++  java
  • 【数论】HDU 4143 A Simple Problem

    题目内容

    给出一个正整数(n),找到最小的正整数(x),使之能找到一个整数(y),满足(y^2=n+x^2)

    输入格式

    第一行是数据组数(T),每组数据有一个整数(n)

    输出格式

    输出(T)行,表示(x),若找不到答案输出(-1)

    数据范围

    (0le nle 10^9)

    样例

    2
    2
    3

    样例输出

    -1
    1

    思路

    A Not Simple Problem
    原式变形一下:
    (n=(y+x)(y-x))
    因此找到(n)的两个因子,设为(a_1=y+x)(a_2=y-x)
    此时(a_1-a_2=2x),找到差最小值即可。
    需要满足的条件:
    (x)是正数 (Rightarrow a_1>a_2)
    (x)是整数 (Rightarrow (a_1-a_2)\%2=0)
    (y)是整数 (Rightarrow (a_1+a_2)\%2=0)

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            int n;
            scanf("%d",&n);
            int ans=0x3f3f3f3f;
            bool flag=false;
    
            for(int i=1;i<=sqrt(n);i++){
                if(n%i==0&&(i+n/i)%2==0&&(n/i-i)%2==0&&i!=n/i&&(n/i-i)>0){
                    flag=true;
                    if(n/i-i<ans)ans=n/i-i;
                }
            }
    
            if(flag)printf("%d
    ",ans/2);
            else printf("-1
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    第十二周作业
    第十一周作业
    第十周作业
    第九周作业*
    #**第八周作业+预习作业**
    第七周作业
    Linux 日志查看常用命令
    Linux tar命令
    Java 数组
    设计模式 观察者模式(Observer)
  • 原文地址:https://www.cnblogs.com/Midoria7/p/12951497.html
Copyright © 2011-2022 走看看