A - 369 Editorial
by
yuto1115
解説
AtCoder をはじめたばかりで何をしたらよいか分からない方は、まずは practice contest の問題A「Welcome to AtCoder」を解いてみてください。基本的な入出力の方法が載っています。
また、プログラミングコンテストの問題に慣れていない方は、AtCoder Beginners Selection の問題をいくつか解いてみることをおすすめします。
簡単のため、\(A \leq B\) を仮定して考えます(そうでない場合は \(A\) と \(B\) の値を入れ替えればよいです)。
まず、「\(A,B,x\) をうまく並び替えて等差数列を作れる」ことと「\(A,B,x\) を値が小さい順に並べて等差数列を作れる」ことは同値(イコール)です。なぜなら、すべての等差数列は値の小さい順か大きい順に並んでおり、後者の場合は列を反転すれば値の小さい順に並んだ等差数列が得られるからです。よって、\(x\) に対する条件は以下のように書き表せます。
- 条件:\(A,B,x\) のうち、\(1\) 番目に大きい数と \(2\) 番目に大きい数の差が、\(2\) 番目に大きい数と \(3\) 番目に大きい数の差に等しい。
\(A=B\) の場合と \(A<B\) の場合で分けて考えます。
\(A=B\) の場合
\(x=A=B\) のとき、またそのときに限り条件を満たすことができます。よって答えは \(1\) です。
\(A<B\) の場合
\(A,B,x\) の大小関係としては、\(x<A<B\)、\(A<B<x\)、\(A<x<B\) の \(3\) パターンが考えられます(\(x\) が \(A,B\) のいずれかに一致する場合は条件を満たせないため除外しています)。
\(x < A < B\) の場合、条件は \(B-A = A-x\) と表されるので、条件を満たす \(x\) の値は \(x=2A-B\) とただ一通りに定まります。
\(A < B < x\) の場合も同様に、条件を満たす \(x\) の値は \(x=2B-A\) とただ一通りに定まります。
\(A < x < B\) の場合、条件は \(B-x = x-A\) と表されます。これを解くと \(x = \frac{A+B}{2}\) となりますが、\(x\) は整数でなければならないことから、\(A+B\) が偶数の場合に限り条件を満たす \(x\) が存在します。
まとめ
以上の議論により、本問題の答えは以下のように表されます。
- \(A=B\) のとき、\(1\)
- \(A\neq B\) かつ \(A+B\) が偶数のとき、\(3\)
- \(A\neq B\) かつ \(A+B\) が奇数のとき、\(2\)
あとはこの場合分けを if 文などを用いて実装すればよいです。 また、ある整数が偶数かどうかは、その整数を \(2\) で割った余りが \(0\) かどうかで判定できます(多くのプログラミング言語には余りを求める演算子が用意されています)。 具体的な実装方法については下記の実装例 (C++, Python) も参考にしてください。
実装例 (C++) :
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
if (a == b) {
cout << 1 << endl;
} else if ((a + b) % 2 == 0) {
cout << 3 << endl;
} else {
cout << 2 << endl;
}
}
実装例 (Python) :
a, b = map(int, input().split())
if a == b:
print(1)
elif (a + b) % 2 == 0:
print(3)
else:
print(2)
posted:
last update: