けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 270 A - 1-2-4 Test (6Q, 灰色, 100 点)

背景に二進法がある問題!

問題概要

3 問の問題があって、それぞれ配点は 1 点、2 点、4 点である。

高橋君は  A 点、青木君は  B 点であった。すぬけ君は、高橋君が解けた問題は解けて、青木君が解けた問題も解けた。だが、高橋君も青木君も解けなかった問題は解けなかった。

すぬけ君は何点か?

制約

  •  0 \le A, B \le 7

考えたこと

1, 2, 4 というのは、それぞれ  2^{0}, 2^{1}, 2^{2} であることに注意しよう。つまり、 A, B を二進法で表すと、ちょうど次のことを表しているのだ


  •  2^{0} の位(最も右の位)の値が 1 であること:
    • 配点 1 点の問題が解けたことを表す
    • (逆に位の値が 0 であることは、解けなかったことを表す)
  •  2^{1} の位(右から 2 番目の位)の値が 1 であること:
    • 配点 2 点の問題が解けたことを表す
    • (逆に位の値が 0 であることは、解けなかったことを表す)
  •  2^{2} の位(右から 3 番目の位)の値が 1 であること:
    • 配点 4 点の問題が解けたことを表す
    • (逆に位の値が 0 であることは、解けなかったことを表す)

たとえば、 A = 6 のとき、この数値を二進法で表すと 110 となる。 2^{0} の位が 0、 2^{1} の位が 1、 2^{2} の位が 1 であるから、高橋君は、配点が 1 点の問題は解けず、2 点の問題と 4 点の問題が解けたことを意味する。

実は A | B でよい

それでは、すぬけ君の得点を考えよう。問題設定から、次のように言える。


  •  2^{0} の位の値:
    •  A B のいずれかの  2^{0} の位の値が 1 ならば 1
    • そうでなければ 0
  •  2^{1} の位の値:
    •  A B のいずれかの  2^{1} の位の値が 1 ならば 1
    • そうでなければ 0
  •  2^{2} の位の値:
    •  A B のいずれかの  2^{2} の位の値が 1 ならば 1
    • そうでなければ 0

この値は、すなわち A | B A, B の論理和)である。つまり、実はこの問題は A, B の値を受け取って、A | B の値を出力するだけでよいのだ!

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int A, B;
    cin >> A >> B;
    cout << (A | B) << endl;
}