Title

P9783 [ROIR 2020 Day1] 平方 题解

题目大意

给你一个整数 $n$,问你能否找到两个正整数 $x$ 和 $y$ 使得 $x^2-y^2=n$。

解题思路

首先,我们把以上式子分解一下,得到 $(x-y)\times(x+y)=n$,令 $c_1\times c_2=n$,得 $\begin{cases}x+y=c_1\\ x-y=c_2 \end{cases} \Rightarrow \begin{cases}x=\frac{c_1+c_2}{2}\\y=\frac{c_1-c_2}{2} \end{cases}(c_1>c_2)$,那么,该式子有解当且仅当 $(c_1+c_2)\bmod 2=0$,$(c_1-c_2)\bmod 2=0$。易得,$c_1$ 和 $c_2$ 奇偶性相同,即 $c_1$ 和 $c_2$ 同奇同偶。分以下两种情况讨论:

  1. 当 $n$ 为奇数时,此时若 $n>1$ ,恒有解,其中一组关于 $c_1$、$c_2$ 的解为 $\begin{cases}c_1=1\\c_2=n\end{cases}$。
  2. 当 $n$ 为偶数时,当且仅当 $n\bmod 4=0$ 且 $n>4$ 时有解,其中一组关于 $c_1$、$c_2$ 的解为 $\begin{cases}c_1=2\\c_2=\frac{n}{2}\end{cases}$。

综上所述,按照以上两种情况讨论即可,输出时分别输出 $\max( \frac{c_1+c_2}{2},\frac{\mid c_1-c_2\mid }{2})$ 和 $\min( \frac{c_1+c_2}{2},\frac{\mid c_1-c_2\mid }{2})$ 即可。

AC 代码

#include<math.h>
#include<stdio.h>
#define ll long long
#include<algorithm>
using namespace std;
ll n,c1,c2;
bool is=true;
int main(){
    scanf("%lld",&n);
    if(n==0){
        printf("Yes\n1 1");
        return 0;
    }
    if(n==1||n==4){
        printf("No");
        return 0;
    }
    if(n&1){
        puts("Yes");
        c1=1,c2=n;
    }else{
        if(n%4!=0) 
            puts("No"),
            is=false;
        else{
            puts("Yes");
            c1=2,c2=n/2;
        }
    }if(is)
        printf("%lld %lld",max((c1+c2)/2,abs(c1-c2)/2),min((c1+c2)/2,abs(c1-c2)/2));
}
posted @ 2023-10-23 20:30  UncleSam_Died  阅读(29)  评论(0)    收藏  举报  来源