题意:现有n个采石场,第i个采石场有mi堆石子,各堆分别有xi,xi+1……,xi+m-1颗石子。两名选手使用最优策略进行Nim游戏,双方轮流操作,每次操作为从任意一堆石子取出任意数量的石子,不能操作者败。现对于一初始局面,先手必胜输出“tolik”,否则输出“bolik”(不含引号)。
题解:根据Nim的结论,所有数异或一下即可,然而这些数比较大,所以再做个优化
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 123456;
ll n;
ll a[N], b[N];
int main(){
while(cin >> n){
ll ans = 0;
for(ll i = 1; i <= n; i ++) {
cin >> a[i] >> b[i];
ll endd = a[i] + b[i] - 1;
if(a[i] & 1) {
ans ^= a[i];
a[i] ++, b[i] --;
}
if(b[i]) {
ll siz = b[i] >> 1;
if(siz & 1)ans ^= 1;
if(b[i] & 1)ans ^= endd;
}
}
ans ? puts("tolik") : puts("bolik");
}
return 0;
}