计算l,l+1,l+2,...r的异或和 输入格式: 输入包括两个整数1≤l,r≤1018 输出格式: 输出题目描述中的整数
时间: 2024-02-29 13:53:05 浏览: 130
题目中给出的l和r的范围非常大,因此需要使用数学方法来解决。
可以发现,l ~ r 的异或和可以表示为:f(l-1) ^ f(r),其中f(x)表示0~x的异或和。
进一步地,可以发现,f(x)的周期为4,即:
f(4k) = 4k
f(4k+1) = 1
f(4k+2) = 4k+3
f(4k+3) = 0
因此,可以将l和r分别对4取模得到l'和r',然后计算f(l'-1) ^ f(r'),再考虑l和r各自除以4的余数即可。
以下是C++代码实现:
```c++
#include <iostream>
using namespace std;
typedef long long LL;
LL calc(LL x)
{
LL res = 0;
if (x % 4 == 1) res = 1;
else if (x % 4 == 2) res = x + 1;
else if (x % 4 == 3) res = 0;
else if (x % 4 == 0) res = x;
return res;
}
int main()
{
LL l, r;
cin >> l >> r;
LL ans = calc(l-1) ^ calc(r);
LL lmod = l % 4, rmod = r % 4;
if (lmod == 1 || lmod == 2)
ans ^= 1;
if (rmod == 2 || rmod == 3)
ans ^= r+1;
cout << ans << endl;
return 0;
}
```
阅读全文