AtCoder Beginner Contest 121

atcoder第二次AK,開心。過段時間穩定點開始AGC。

AB讀明白題就行,C簡單拍個序。

D題

題意:計算A,A+1,…… ,B這些數的異或結果。

思路:記f(a,b)爲[a,b]內所有數的異或結果,則a>=1時f(a,b)=f(1,a-1)^f(1,b)。

只要計算出1,2,……,n這些數的異或結果即可,記爲g(n)

當一個數爲偶數,則這個數於比他大1的數異或值爲1.

則 當n爲奇數時,和前一個偶數異或爲1,之前的兩兩組合,計算最後的組合數及最開始的1總共的個數,得到結果1或0

     當n爲偶數,n-1與n-2組合,往前以此類推,得到g(n-1)結果0或1,再異或n。

#include<iostream>
#include<algorithm>
using namespace std;
long long xor1_a(long long a)
{
    if(a%4==1) return (long long)1;
    else if(a%4==2) return a+1;
    else if(a%4==3 ||a==0) return (long long)0;
    else return a;
}
int main()
{
    long long n,m;
    cin>>n>>m;
    if(n==0) cout<<(xor1_a(m))<<endl;
    else cout<<((xor1_a(n-1))^(xor1_a(m)))<<endl;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章