1 条题解
-
0
自动搬运
来自洛谷,原作者为

max0810
刚刚上初一,正在学习数据结构,求大佬带搬运于
2025-08-24 22:39:59,当前版本为作者最后更新于2022-09-16 11:28:09,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
考试的时候在乱猜结论,交了几遍就过了,证明当然是赛后才想的()文中加粗部分是需要读者稍微思考一下原因的地方
(不是重点)。
先考虑一下样例二,将 化成二进制:。
其实只需要知道末尾有 个 就行了,因为在 变为 时,后面 个 就会变成 个 ,如果再异或 ,就相当于把末尾的几位变成 ,此时除了末尾上的 , 的前面部分的数已经不会影响结果了(因为最后求 就只关心末几位的值)。所以每做一次操作,末几位都是 ,那么最后的 就是 。
再扩展到一般情况:
-
是偶数, 是奇数,那么二进制中的最后一位就始终都是 ,所以最后的 就是 。
-
是偶数, 是偶数,这个就和样例二差不多: 的二进制末尾至少有一个 , 的末尾就至少有 个 ,肯定比 的二进制的位数多,异或 就相当于把末尾的几位变成 ,又因为 是偶数,所以 的末尾也至少有一个 ,又变成了开始的情况,只不过末几位是 而不是 。一直推下去,最后的 就是 。
-
是奇数,此时根据 的奇偶又分成两种情况:
- 是偶数,和前面一样: 的末尾至少有 个 ,异或 就相当于把末尾的几位变成 ,因为我们只关心末几位,所以就可以把原数看成 。
- 是奇数,那么 也是奇数,因为 也是奇数,奇数异或奇数就变成了偶数,然后又变成了上一个情况,即奇偶交替。
- 如果最后的数是个奇数,那么 就是 。
- 如果最后是个偶数,那么就要考虑倒数第二步。因为 ,所以倒数第二步的数的二进制末尾一定是 ,那么最后答案就相当于 。
其实做到这就已经做完了,但是 还可以化简一下。
考虑用二项式定理展开 :
$$c^{2c}=(c-1+1)^{2c}=\sum_{i=0}^{2c} C_{2c}^{i}\times (c-1)^i=1+2c(c-1)+C_{2c}^{2}\times (c-1)^2+...+(c-1)^{2c} $$我们将上式所有项按 大小来排序,最小的两项当然是 和 ,因为 是偶数,所以 $\operatorname{lowbit}(2c(c-1))=\operatorname{lowbit}(c-1)\times 2$
从第三项开始,所有项的 都不小于 ,所以 一定可以被表示为 ,其中 。
形象点,把 和 的二进制分别表示出来(随便一个例子,只需要看后五位)::
:
可以发现,最末尾的 会抵消,但倒数第二位不会,所以 $\operatorname{lowbit}(c^{2c}\oplus c)=\operatorname{lowbit}(c-1)$。
#include <iostream> #include <cstdio> #define ll long long using namespace std; ll a,b,c; ll lb(ll x){return x&-x;} int main() { cin >> a >> b >> c; if(c&1) { if((a&1)^(b&1))cout << 1; //ab不同奇偶,那么最后答案就是奇数 else cout << lb(c-1); //ab同奇偶,最后答案就是偶数 } else cout << ((a&1)?1:lb(c)); return 0; } -
- 1
信息
- ID
- 7851
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者