B4261 [GESP202503 三级] 2025
欢迎报名洛谷网校,报名课程可以获得对应组别的知识点讲解与答疑服务,期待和大家一起进步!点击图片即可报名。
:::align{center} :::
本题考察枚举、位运算。
首先先介绍一种笨办法——枚举法。题目中的 &,而 |。参考代码:
for (int i = 1; i <= 2025; i++){
if ((x & i) + (x | i) == 2025) {
cout << i << endl;
return 0;
}
}
这种做法足够通过本题。但是我们再介绍一种巧妙方法。题目中的
这是为什么呢?我们把
- 情况 1:
a 是0 ,b 也是0 ,此时a \operatorname{and} b=0 ,a \operatorname{or} b=0 ,a + b = 0 ; - 情况 2:
a 是0 ,b 是1 ,此时a \operatorname{and} b=0 ,a \operatorname{or} b=1 ,即(a \operatorname{and} b) + (a \operatorname{or} b) = 1 ,而a + b = 1 ,两者相等; - 情况 3:
a 是1 ,b 是0 ,此时与情况2 完全一致; - 情况 4:
a 是1 ,b 也是1 ,此时a \operatorname{and} b=1 ,a \operatorname{or} b=1 ,即(a \operatorname{and} b) + (a \operatorname{or} b) = 2 ,而a + b = 2 ,两者相等;
在每一个位置上,
因此题目就变为了:已知