题目描述
解题思路
可以求得通项公式:an = 2n + 1,所以问题就变成等差数列求异或和,这个具体为什么对我还不能很好地解释清楚,先挖坑吧。
附:c++代码
1 #include <iostream> 2 #include <cstdio> 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 else 18 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 ", ans); 49 cout << ans <<endl; 50 } 51 return 0; 52 }
另一种思路
这是官方给出的题解。