Codeforces 1658D1 - 388535 (Easy Version)(bitmask)

博客探讨了位操作在数组变换中的应用,通过分析0到n的二进制表示,揭示了0的个数通常多于1的个数的规律。基于此,提出了一种复原经过异或操作的数组的方法,根据数组中每一位0和1的数量关系确定原数组中对应位的值。核心思想在于通过位操作恢复原始数据的平衡特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
题解:对一组从0开始累加1的数,列出它们的二进制表示,会发现,每一位的0的总数一定是大于1的总数的。以0~7为例:
在这里插入图片描述
因此,因为题中给出的输入,即经x按位异或后的数组a,一定是从0~n的原数组合法变换过来的,那么复原后,原数组一定符合前述规律。所谓复原,无非就是把x的第i位取1,使数组a中每个数的第i位取反——这会使0的综述与1的总数的大小关系变换;或者把x的第i位取0,这样数组a中每个数的第i位不变。对每一位,这两种操作取其一。

因此,

  1. 如果a中第i位0的个数大于1的个数,则x的第i位只能取0;
  2. 如果a中第i位的0的个数小于1的个数,则x的第i位只能取1;
  3. 如果a中第i位0的个数等于1的个数,则x第i位随意。

第3点的粗浅证明:只有当数的个数为2的倍数时,才有可能在第i位上有0的个数等于1的个数。这意味着,原数组为{0~2^t-1},它们所有数是每个位上取0或1的全排列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值