给出第一个石堆的石子数x和石堆数m,石堆中石子数为首项为x 公差为1 项数为m 的等差数列,求Nim游戏结果。
即计算异或值x^(x+1)^(x+2)^...^(x+m-1),判断是否非0。
x和m的范围是long long,无法暴力。。
发现性质:(2x)^(2x+1)=1,利用一下就好了。
如果首项为奇数或末项为偶数都要单独异或答案。
剩下的都是1啦。
#include <cstdio>
int main() {
long long x, m, ans = 0; int i, n;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%I64d%I64d", &x, &m);
long long end = x + m - 1;
if (x & 1) m--, ans ^= x;
ans ^= (m & 2 ? 1 : 0) ^ ((m & 1) ? end : 0);
}
puts(ans ? "tolik" : "bolik");
return 0;
}
http://codeforces.com/problemset/problem/15/c