問題
問題文
$0$ 以上 $255$ 以下の整数 $A,B$ が与えられます。$A {\rm xor} C = B$ となる
$0$ 以上の整数 $C$ を求めてください。
なお、そのような $C$ はただ $1$ つ存在し、$0$ 以上 $255$ 以下であることが証明されます。
制約
・$0 \le A,B \le 255$
・入力に含まれる値は全て整数である
回答
回答1 (AC)
問題文より $0 \le C \le 255$ になることが保証されているので、$C$ に関するループを回せば良いでしょう。なお、C++ では a と b の xor は a^b で求められます。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
for ( int c=0; c<256; c++ ) {
if ( (a^c)==b ) {
cout << c << endl;
break;
}
}
}
回答2 (AC)
xor の持つ性質として次の2つが有名です:(1) $0$ との xor は値が変わらない、つまり $A$ xor $0$ = $A$。(2) 自分自身との xor の結果は必ず $0$ になる、つまり $A$ xor $A = 0$。
これらの性質を利用して、与えられた式を変形します。与えられた式 $A$ xor $C=B$ の両辺に $A$ を xor すると、$A$ xor $A$ xor $C = A$ xor $B$ となり、$0$ xor $C = A$ xor $B$ つまり $C=A$ xor $B$ となります。つまり、求める値 $C$ は $A$ xor $B$ に等しいことがわかりました。
この等式を利用したコードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << (a^b) << endl;
}
調べたこと
AtCoder の解説 → 公式解説
回答1,回答2の両方が紹介されていました。
リンク
前後の記事
- 前の記事 → AtCoderログ:0065 - ABC 071 B
- 次の記事 → AtCoderログ:0067 - ABC 061 B