前言
这个题目在我之前那篇c++位运算的的随笔中提到过。
有兴趣的话去看看吧!
飞机场:https://www.cnblogs.com/laoguantongxiegogofs/p/12444517.html
题目描述
题目描述
给出区间(a,b),b >= a,求a xor (a+1) xor (a+2).....xor ba xor (a+1) xor (a+2).....xor b。
题目输入
输入2个数:a b,中间用空格分隔(1 <= a <= b <= 10^9)
样例:
3 8
题目输出
输出一个答案
样例:
11
题解正文
这个题很水,上面虽然说从1到10的九次方,但是数据并没有那么大,一个暴力循环也会过。
暴力这里不打了,看过我的那篇位运算的同学应该都会写。
但是,我们要追求正解。
下面是一个很好的办法:
我们找一找规律
从0到3这四个数异或,也就是0^1^2^3.
转换为二进制计算为:
00^01^10^11=0
从4到7这四个数:
100^101^110^111=0
从8到11这四个数:
1000^1001^1010^1011=0
从12到15、从16到19……
相信你找出规律了,这样的每四个数异或的结果都是0.
又因为0异或所有数都不变,两个相同的数异或得0。(具体看我的位运算那篇文章)
这样就会有思路了。
写一个函数work()
计算1异或到a-1的结果异或1异或到b(为什么异或到a-1不用我说吧)
就是计算结果了。
有人说计算a-1多难啊!
上面不是有方法嘛,把一个数对四取余,按照规律异或就好,时间复杂度会控制在很小很小。
好了,思路清晰,就上代码吧!
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #define inf 100000000 7 int work(int x) 8 { 9 int k=x%4,ans=0; 10 x-=k; 11 for(int i=0;i<=k;i++) 12 { 13 ans=ans^(x+i); 14 } 15 return ans; 16 } 17 using namespace std; 18 int main() 19 { 20 int a,b,x,y; 21 cin>>a>>b; 22 printf("%d",work(a-1)^work(b)); 23 return 0; 24 }
代码也很简单哎!
后记
今天又是一个双更的日子,以后会把提到的题目全部写出题解。如果感觉文章有问题,就在评论区通知我!
给个赞再走吧!