Atcoder Beginner Contest 121 D - XOR World(区间异或和)
题目链接:https://atcoder.jp/contests/abc121/tasks/abc121_d
题目很裸(Atcoder好像都比较裸
就给一个区间求异或和
n到1e12
肯定不能O(n)推
那肯定得通过异或的一些性质
用$f\left( a,b\right)$表示[a,b]区间的异或和
我只观察出了$f\left( 2^{a},2^{b}-1\right)$的异或和肯定为0。
通过$f\left( 2^{a},2^{a+1}-1\right)$每一位都会出现偶数次
例如 [4,8)
4 : 100
5 : 101
6 : 110
7 : 111
异或和就为0
那么的$f\left( 2^{a},2^{b}-1\right)$ = $f\left( 2^{a},2^{a+1}-1\right)$ ^ $f\left( 2^{a+1},2^{a+2}-1\right)$ ^ ... ^ $f\left( 2^{b-1},2^{b}-1\right)$ = 0
在这里参考了大佬的博客https://www.cnblogs.com/Mychael/p/8633365.html原来有结论orz
得到上述结论后 不难得到 $f\left( 0, n\right)$ = $f\left( 2^{k}, n\right)$
分奇偶来看
当n为奇数
那么$f\left( 2^{k}, n\right)$ k的那一位会出现 n - 2^{k} + 1次 也就是偶数次
那么最后结果最高位就为0了 $f\left( 2^{k}, n\right) = f\left( 0, n-2^{k}\right)$ 不清楚可以看下上面 4,5,6,7的例子
是不是最高位的1都可以减去了 也就是都减去4 $f\left( 4, 6\right) = f\left( 4 - 4, 6 - 4\right) = f\left( 0, 2\right)$ 没错吧!
$f\left( 0, n-2^{k}\right)$ 又可以表示为 $f\left( 0, n'\right) = f\left( 2^{k-1}, n'\right)$ 接着推推推
推到最后 到了0~4的范围里 为啥到4(2的2次)而不是到2(2的1次)呢
因为上述结论是 $f\left( 2^{a},2^{a+1}-1\right) = 0$ 如果a等于0了 $f\left( 2^{0},2^{1}-1\right) = f\left( 1,1\right) = 1 \neq 0$
所以结论只适用于a >= 1的情况 所以最后应该在0~4里面确定结论
$n\equiv 1\left( mod4\right)$ 那么最后还剩最末位一个1 即 $f\left( 0,n\right) =1$
$n\equiv 3\left( mod4\right)$ 那么最后还有1和3进行异或 最末位就为0了 即 $f\left( 0,n\right) =0$
n为偶数的时候(感觉原博主这部分的推导写错了 但结论是对的
假如这个n是2的次幂了 那么$f\left( 2^{a},n\right) = n$就ok了
如果不是的话 $f\left( 2^{k}, n\right)$ k的那一位会出现 n - 2^{k} + 1次 也就是奇数次 那么得保留
所以 $f\left( 2^{k}, n\right) = f\left( 0, n-2^{k}\right) Xor 2 ^{k}$ 这次得看$n-2^{k}$是否为2的次幂
是的话就是$f\left( 2^{k}, n\right) = f\left( 0, n-2^{k}\right) Xor 2 ^{k} = n-2^{k} Xor 2 ^{k} = n$
如果一直不是的话 就会把原来的n的每一位都积累起来 最后到$6 - 2^{2} = 2$ 这个时候最后还要异或上1 答案就是n+1
也就是 $n\equiv 0\left( mod4\right)$ $f\left( 0,n\right) =n$
$n\equiv 2\left( mod4\right)$ $f\left( 0,n\right) =n + 1$
总结成程序就是
int Xor(int a) {
if (a % == ) return a;
if (a % == ) return ;
if (a % == ) return a + ;
return ;
}
答案即为$f\left( a, b\right) = f\left( 0, b\right) Xor f\left( 0, a-1\right)$
代码如下
#include <cstdio>
using namespace std; long long Xor(long long a) {
if (a % == ) return a;
if (a % == ) return ;
if (a % == ) return a + ;
return ;
} int main() {
long long a, b;
scanf("%lld%lld", &a, &b);
printf("%lld", Xor(a -) ^ Xor(b));
return ;
}
推的过程比较混乱建议手动模拟一遍( ̄▽ ̄)
Atcoder Beginner Contest 121 D - XOR World(区间异或和)的更多相关文章
- AtCoder Beginner Contest 121 题解
题目链接:https://atcoder.jp/contests/abc121 A White Cells 分析:题目数据规模很小,直接暴力修改都可以.或者可以推出公式. 代码: #include & ...
- AtCoder Beginner Contest 098 D - Xor Sum 2
D - Xor Sum 2 Time limit : 2sec / Memory limit : 1024MB Score : 500 points Problem Statement There i ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 238 A - F 题解
AtCoder Beginner Contest 238 \(A - F\) 题解 A - Exponential or Quadratic 题意 判断 \(2^n > n^2\)是否成立? S ...
- AtCoder Beginner Contest 260 (D-E)
AtCoder Beginner Contest 260 - AtCoder D - Draw Your Cards 题意:N张卡牌数字 1-n,以某种顺序排放,每次拿一张,如果这一张比前面某一张小( ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
随机推荐
- Java验证工具类
在项目中使用Java经常有验证功能的使用,比如手机号,密码等验证. 总结一下,写出个工具类方便以后用的时候直接引. package com.common.utils; import org.apach ...
- mongodb .explain('executionStats') 查询性能分析(转)
mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) ...
- ASP.NET Core依赖注入——依赖注入最佳实践
在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用 ...
- 2017软工实践K班总结
回首一学期的软工实践,从暑假开始陆续布置作业,经历个人.结对与团队等大小作业.也经历了不少同学被吓跑.第一周就退选的情况,能坚持下来的都是胜利者,至少你们有一颗愿意挑战的心.首先感谢助教谢涛付出的巨大 ...
- 【学习总结】C-翁恺老师-入门-第0周<程序设计与C>
[学习总结]C-翁恺老师-入门-总 1-首先按视频说的下载编辑器 <DevC++> 并一路默认设置: 安装包下载链接 (我有vc6.0不过预感告诉我老师要用类似CS50里那种命令行编辑器? ...
- JEECG DataGridColumn dictionary使用问题
<t:dgCol title="线索所属人" field="ownerId" query="true" queryMode=&q ...
- [转帖]wifi 4G 和 蓝牙的区别
作者:沈万马链接:https://www.zhihu.com/question/64739486/answer/225227838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- ELK日志系统+x-pack安全验证
根据之前已经搭好的ELK系统,现在加一个x-pack插件上去,不然谁拿到ip和端口都可以访问elasticsearch和kibana. 要的效果如下:打开kibana界面的时候要让其输入用户名密码才能 ...
- 剑指offer(16)栈的压入、弹出序列
题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...
- 数组中元素累加 reduce
例: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...