题目描述
解题思路
可以求得通项公式:an = 2n + 1,所以问题就变成等差数列求异或和,这个具体为什么对我还不能很好地解释清楚,先挖坑吧。
附:c++代码
1 #include2 #include 3 4 using namespace std; 5 6 typedef unsigned long long llt; 7 8 llt Cal(llt x, llt d, llt P, llt Num) 9 {10 llt ret = 0;11 ret += (x / P) * Num;12 x %= P;13 ret += (d / P) * Num * (Num - 1) / 2;14 d %= P;15 if (d * Num + x < P)16 return ret;17 else18 return ret + Cal((d * Num + x) % P, P, d, (d * Num + x) / P);19 }20 21 llt My_Xor(llt l, llt r, llt d)22 {23 llt Num = r - l +1;24 llt x = l * 2 + 1;25 llt ans = 0, Sum, P = 1;26 for (llt i = 1; i <= 36; i++)27 {28 Sum = Cal(x, d, P, Num);29 if (Sum & 1)30 ans += P;31 P <<= 1;32 }33 return ans;34 }35 36 int main()37 {38 //freopen("mi.in", "r", stdin);39 //freopen("H.out", "w", stdout);40 int n, i;41 llt l, r, ans;42 scanf("%d", &n);43 for(i = 1; i <= n; i++)44 {45 //scanf("%I64d%I64d", &l, &r);46 cin >> l >> r;47 ans = My_Xor(l, r, 2);48 //printf("%I64d\n", ans);49 cout << ans <
另一种思路
这是官方给出的题解。