专栏文章

【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 个月前
查看原文

记号与约定

  • xxzx'\coloneqq x\oplus z
  • yyzy'\coloneqq y\oplus z
  • kikk_i\coloneqq k 的第 ii 位(0i<h0\le i<hkk 为本文或题目中定义的整数变量);
  • 本文中所有的「位」均指二进制位。

思路

在本题中,我们肯定是希望 xx'yy' 都尽可能大。
~根据幼儿园数学~,比较数的大小要从高位向低位比较,即贪心地,我们希望 xx'yy' 的高位中 11 尽可能多。
于是考虑从高 (h1)(h-1) 位向低 (0)(0) 位枚举,假设枚举到第 ii 位,则有以下两种情况:
  1. xi=yix_i=y_i
    直接置 xi=yi=1x'_i=y'_i=1,即置 zi=xiˉ=yiˉz_i=\bar{x_i}=\bar{y_i}
  2. xiyix_i\not =y_i
    比较 xx'yy',将较小者的第 ii 位置为 11
    为什么这么做
    由于我们是由高位向低位枚举,在本轮处理中较大者在最终结果中必然较大。
    根据位值原理将每一位拆开,则 xx'yy' 中的任意一个数在本轮结束后的贡献都可以看作是高 hih-i 位的贡献加上第 ii 位的贡献。高 hih-i 位的贡献固定,考虑第 ii 位的贡献。
    xix'_i 的贡献为 2ixiy2^ix'_iy'yiy'_i 的贡献为 2iyix2^iy'_ix'。而 xix'_iyiy'_i 中必有一 1100,则选择置 11 后贡献更大的,即在上述表达式中最后一个因数更大的置 11,即将较小者的第 ii 位置 11
答案为 xyx'y'

代码

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 条评论,欢迎与作者交流。

正在加载评论...