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$ 同奇同偶。分以下两种情况讨论:
- 当 $n$ 为奇数时,此时若 $n>1$ ,恒有解,其中一组关于 $c_1$、$c_2$ 的解为 $\begin{cases}c_1=1\\c_2=n\end{cases}$。
- 当 $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));
}

浙公网安备 33010602011771号