Codeforces Round 764 (Div. 3) B – Make AP を解いた記録

問題の概要

正の整数\(a, b, c\)が与えられる.好きな正の整数\(m\)を選び,\(a, b, c\)のうちどれか1つを\(m\)倍する.
\(a, b, c\)を等差数列にできるか?ただし,\(a, b, c\)の並び順は変えられない.

問題へのリンク

制約

  • \(1 \leq a, b, c \leq 10^{8}\)
  • 入力はすべて整数

解法

\(a, b, c\)が等差数列であることは,ある整数\(d\)を用いて\(a = b-d, c = b+d\)と表せることと等価です.
操作はちょうど1回行うので,\(a, b, c\)のどれか1つに対して操作を行ったときに\(a = b-d, c = b+d\)を満たせるか調べればよいです.

aに対して操作を行う場合

\(a = b-d, c = b+d\) より \(a = 2b-c\) を満たせればよいです.
よって,元々の\(a\)が\(2b-c\)の倍数であり,かつ\(2b-c\)が正の整数であればよいです.

bに対して操作を行う場合

\(a = b-d, c = b+d\) より \(2b = a+c\) を満たせればよいです.
よって,元々の\(b\)が\(\frac{a+c}{2}\)の倍数であればよいです.

cに対して操作を行う場合

\(a = b-d, c = b+d\) より \(c = 2b-a\) を満たせればよいです.
よって,元々の\(c\)が\(2b-a\)の倍数であり,かつ\(2b-a\)が正の整数であればよいです.

実装例

提出コード