2653 區間xor

前言

這個題目在我以前那篇c++位運算的的隨筆中提到過。html

有興趣的話去看看吧!ios

飛機場:http://www.javashuo.com/article/p-cshhnvsm-cn.htmlc++

題目描述

題目描述

給出區間(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)spa

樣例:code

3 8

題目輸出

輸出一個答案xml

樣例:htm

11

題解正文

這個題很水,上面雖說從1到10的九次方,可是數據並無那麼大,一個暴力循環也會過。blog

暴力這裏不打了,看過個人那篇位運算的同窗應該都會寫。ci

可是,咱們要追求正解。

下面是一個很好的辦法:

咱們找一找規律

從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到1五、從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 }

代碼也很簡單哎!


後記

今天又是一個雙更的日子,之後會把提到的題目所有寫出題解。若是感受文章有問題,就在評論區通知我!

 

 

給個贊再走吧!

相關文章
相關標籤/搜索