背景に二進法がある問題!
問題概要
3 問の問題があって、それぞれ配点は 1 点、2 点、4 点である。
高橋君は 点、青木君は 点であった。すぬけ君は、高橋君が解けた問題は解けて、青木君が解けた問題も解けた。だが、高橋君も青木君も解けなかった問題は解けなかった。
すぬけ君は何点か?
制約
考えたこと
1, 2, 4 というのは、それぞれ であることに注意しよう。つまり、 を二進法で表すと、ちょうど次のことを表しているのだ
- の位(最も右の位)の値が 1 であること:
- 配点 1 点の問題が解けたことを表す
- (逆に位の値が 0 であることは、解けなかったことを表す)
- の位(右から 2 番目の位)の値が 1 であること:
- 配点 2 点の問題が解けたことを表す
- (逆に位の値が 0 であることは、解けなかったことを表す)
- の位(右から 3 番目の位)の値が 1 であること:
- 配点 4 点の問題が解けたことを表す
- (逆に位の値が 0 であることは、解けなかったことを表す)
たとえば、 のとき、この数値を二進法で表すと 110 となる。 の位が 0、 の位が 1、 の位が 1 であるから、高橋君は、配点が 1 点の問題は解けず、2 点の問題と 4 点の問題が解けたことを意味する。
実は A | B
でよい
それでは、すぬけ君の得点を考えよう。問題設定から、次のように言える。
- の位の値:
- と のいずれかの の位の値が 1 ならば 1
- そうでなければ 0
- の位の値:
- と のいずれかの の位の値が 1 ならば 1
- そうでなければ 0
- の位の値:
- と のいずれかの の位の値が 1 ならば 1
- そうでなければ 0
この値は、すなわち 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; }