题目链接:
分析:
l,r的范围为10^18,暴力求解必然超时。
下面我们了解一些异或的基本性质:
异或运算性质:
- 数字与自身的异或结果为0:x⊕x=0
- 数字与0的异或结果为数字本身:x⊕0=x
- 异或运算满足交换律和结合律,即操作顺序不影响结果。
从0到n的异或和:
可以根据 n 对 4 取模的结果来计算从 0 到 n 的所有整数的异或和:
- n%4==0
- n%4==1
- n%4==2
- n%4==3
计算范围 [l, r] 内的异或和:
可以利用以下公式快速计算从 l 到 r 的所有整数的异或和:
这利用了从 0 到 r 的异或和减去从 0 到 (l-1) 的异或和的性质来得到从 l 到 r 的异或和。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(ll x){
if(x%4==0) return x;
else if(x%4==1) return 1;
else if(x%4==2) return x+1;
else return 0;
}
int t;
int main(){
cin>>t;
while(t--){
ll l,r;
cin>>l>>r;
ll ans=f(l-1)^f(r);
cout<<ans<<endl;
}
return 0;
}