Codeforces 76D
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 76D相关的知识,希望对你有一定的参考价值。
蛮有意思的一个关于二进制的题,建立在plus和xor的关系上的题,
由于 $A = X + Y, B = X \\; \\mathrm{xor} \\; Y$,那么 $A = B + ((X \\; \\mathrm{and} \\; Y) << 1)$。
因此 $X \\; \\mathrm{and} \\; Y = (A - B) >> 1$,然后同时根据 $X \\; \\mathrm{xor} \\; Y = B, X \\; \\mathrm{and} \\; Y = (A - B) >> 1$ 这两个条件,在二进制下一位一位的去分类讨论一下 $X$ 和 $Y$ 在那以为到底是 $0$ 还是 $1$。
记 $X$ 和 $Y$ 的每一位分别是 $x$ 和 $y$,讨论:$x \\; \\mathrm{and} \\; y = \\; ?, x \\; \\mathrm{xor} \\; y = \\; ?$
① $1 \\; \\mathrm{and} \\; 1 = 1, 1 \\; \\mathrm{xor} \\; 1 = 0$,
② $0 \\; \\mathrm{and} \\; 0 = 0, 0 \\; \\mathrm{xor} \\; 0 = 0$,这俩是固定的,没得选。
③ $1 \\; \\mathrm{and} \\; 0 = 0, 1 \\; \\mathrm{xor} \\; 0 = 1$,
④ $0 \\; \\mathrm{and} \\; 1 = 0, 0 \\; \\mathrm{xor} \\; 1 = 1$,这俩显然选④,让X更小。
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; int main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); ull a, b; cin >> a >> b; if(a < b) // A will not be less than B { cout << "-1"; return 0; } ull delta = a - b; if((delta & 1) != 0) // if A-B is not even number { cout << "-1"; return 0; } ull x = 0, y = 0; delta >>= 1; // now, delta = x and y ull k = 1; // k = 1, 10, 100, 1000, ... while(true) { ull and_lp = delta & 1, xor_lp = b & 1; // get last place // cout << xor_lp << " " << and_lp << endl; if(xor_lp == 0 && and_lp == 1) x |= k, y |= k; else if(xor_lp == 0 && and_lp == 0) ; // do nothing else if(xor_lp == 1 && and_lp == 0) y |= k; else { cout << "-1"; return 0; } if(delta == 0 && b == 0) break; else delta >>= 1, b >>= 1, k <<= 1; } cout << x << " " << y; return 0; }
以上是关于Codeforces 76D的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段
Codeforces 86C Genetic engineering(AC自动机+DP)
CodeForces 1005D Polycarp and Div 3(思维贪心dp)