文章目錄
1. 題目描述
1.1. Limit
Time Limit: 1000 ms
Memory Limit: 131,072 kB
1.2. Problem Description
給出區間,,求 。
1.3. Input
輸入2個數: ,中間用空格分隔
1.4. Output
輸出一個答案
1.5. Sample Input
3 8
1.6. Sample Output
11
1.7. Source
2. 解讀
計算區間的區間異或,即求 有如下規律。
當 時,;
當 時,;
當 時,;
當 時,;
數學上可以證明這個結論,可以參考Mychael的博客園博客。 我們可以記住這個公式,或者通過如下歸納推導出。
1 | 1 | 1 | 1 | 2 | 3 |
2 | 5 | 1 | 2 | 6 | 7 |
3 | 9 | 1 | 3 | 10 | 11 |
4 | 13 | 1 | 4 | 14 | 15 |
1 |
1 | 3 | 0 | 1 | 4 | 4 |
2 | 7 | 0 | 2 | 8 | 8 |
3 | 11 | 0 | 3 | 12 | 12 |
4 | 15 | 0 | 4 | 16 | 16 |
0 |
定義區間異或運算爲 ,又因爲異或運算 的逆運算還是異或運算 。那麼要通過 求 ,只需再對進行一次異或運算即可。
3. 代碼
#include <iostream>
using namespace std;
#define DEBUG
long long seriesXor(long long m, long long n)
{
long long ans = m;
for (long long i = m + 1; i <= n; i++) {
ans ^= i;
}
return ans;
}
long long calculate(int x)
{
if (x % 4 == 0) {
return x;
} else if (x % 4 == 1) {
return 1;
} else if (x % 4 == 2) {
return x + 1;
} else if (x % 4 == 3) {
return 0;
} else {
return 0;
}
}
int main()
{
// 輸入
int a, b, ans = 0;
scanf("%d %d", &a, &b);
// 計算
ans = calculate(b) ^ calculate(a - 1);
// 輸出
printf("%d\n", ans);
return 0;
}
聯繫郵箱:[email protected]
Github:https://github.com/CurrenWong
歡迎轉載/Star/Fork,有問題歡迎通過郵箱交流。