专栏文章
【MX-X16-T2】「DLESS-3」XOR and Multiply 题解
P13684题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioewqw6
- 此快照首次捕获于
- 2025/12/02 18:05 3 个月前
- 此快照最后确认于
- 2025/12/02 18:05 3 个月前
记号与约定
- ;
- ;
- 的第 位(, 为本文或题目中定义的整数变量);
- 本文中所有的「位」均指二进制位。
思路
在本题中,我们肯定是希望 与 都尽可能大。
~根据幼儿园数学~,比较数的大小要从高位向低位比较,即贪心地,我们希望 与 的高位中 尽可能多。
于是考虑从高 位向低 位枚举,假设枚举到第 位,则有以下两种情况:
-
直接置 ,即置 ; -
比较 与 ,将较小者的第 位置为 。为什么这么做
由于我们是由高位向低位枚举,在本轮处理中较大者在最终结果中必然较大。根据位值原理将每一位拆开,则 与 中的任意一个数在本轮结束后的贡献都可以看作是高 位的贡献加上第 位的贡献。高 位的贡献固定,考虑第 位的贡献。的贡献为 , 的贡献为 。而 与 中必有一 一 ,则选择置 后贡献更大的,即在上述表达式中最后一个因数更大的置 ,即将较小者的第 位置 。
答案为 。
代码
CPP#include <bits/stdc++.h>
#define DN(i, l, r) for(int i = (r); i >= (l); -- i)
using namespace std;
using ll = long long;
int t, x, y, h;
ll xz, yz; // xz:=x', yz:=y'
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> t;
while(t --){
cin >> x >> y >> h;
xz = yz = 0;
DN(i, 0, h - 1){
if((x >> i & 1) == (y >> i & 1)){
xz |= 1 << i;
yz |= 1 << i;
}
else if(xz > yz) yz |= 1 << i;
else xz |= 1 << i;
}
cout << xz * yz << '\n';
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...