はまやんはまやんはまやん

hamayanhamayan's blog

Beautiful tuples [yukicoder No.816]

https://yukicoder.me/problems/no/816

解説

https://yukicoder.me/submissions/340724

答えのCを全列挙する。
そのまま全列挙すると10^18個あって無理なので、候補を絞る。
条件2「どの 2 つの自然数を足しても、残った 1 つの数の倍数になる。 」を使おう。
 
A+Bの約数がCであるので、A+Bの約数を全列挙して、その中で条件を満たすものを答えとする。
約数列挙はO(sqrt(N))で行えるので、やると答え。
方法は↑の前提知識の方に書いた。

ll A, B;
//---------------------------------------------------------------------------------------------------
void _main() {
	cin >> A >> B;

	auto ed = enumdiv(A + B);
	fore(C, ed) {
		if (A == C) continue;
		if (B == C) continue;
		if ((A + C) % B != 0) continue;
		if ((B + C) % A != 0) continue;

		cout << C << endl;
		return;
	}
	cout << -1 << endl;
}