[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;
}
posted @ 2023-11-17 20:52  FurippuWRY  阅读(30)  评论(0)    收藏  举报