[Luogu] P9783 题解
P9783 题解
根据平方差公式,对原式进行变式,得:\(x^2-y^2=(x+y)(x-y)=n\)。
考虑判断 \(n\) 的奇偶性。
若 \(n\) 为偶数,\(x+y\) 和 \(x-y\) 至少有一个式子为偶数,设 \(x+y=2\),则 \(x-y=\dfrac{n}{2}\),解方程得 \(\begin{cases}x=\dfrac{n}{4}+1\\y=\dfrac{n}{4}-1\end{cases}\)。容易发现,当 \(n\) 不为 \(4\) 的倍数时,\(x\) 和 \(y\) 不为整数,此时输出 No,否则输出 Yes 和 \(x,y\)。
若 \(n\) 为奇数,则 \(x+y\) 和 \(x-y\) 一定为奇数,\(x\) 和 \(y\) 的奇偶性不同。设 \(x-y=1,x+y=n\),这样 \((x+y)(x-y)\) 的值一定为 \(n\)。解方程,得 \(\begin{cases}x=\dfrac{n+1}{2}\\y=\dfrac{n-1}{2}\end{cases}\)。输出 Yes 和 \(x,y\)。
特判:当 \(n=1\) 或 \(4\) 时,原方程是无解的,输出 No;\(n=0\) 时,\(x\) 可以等于 \(y\),输出 Yes 和任意两个相同的数。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
int main() {
cin >> n;
if (n == 1 || n == 4) {
cout << "No";
return 0;
}
if (n == 0) {
cout << "Yes\n" << 1 << ' ' << 1;
return 0;
}
if (n % 2 == 0) {
if (n % 4 != 0) {
cout << "No";
}
else {
cout << "Yes\n" << n / 4 + 1 << ' ' << n / 4 - 1;
}
}
else {
cout << "Yes\n" << (n + 1) / 2 << ' ' << (n - 1) / 2;
}
return 0;
}

浙公网安备 33010602011771号