http://codeforces.com/problemset/problem/15/C
题意:有n个矿场,每个矿场输入x和m,表示有m辆车,第一辆有x块石头,第二辆有x+1块,依次类推第m辆有x+m-1块石头,两个人每次可以从任一辆车上取下任意数目的石头,最后不能取者败。
尼姆博弈的结论是,n个数异或起来为0则先手必败。此题数太多,有以下结论,1.从1到n异或运算,n%4==1时结果为1,n%4==2结果为n+1,n%4==3结果为0,n%4=0结果为n.
2.x到y异或,结果为Nim(y)^Nim(x-1)(Nim见代码。
#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<map>
#include<algorithm>
#include<queue>
#include<set>
#define inf 10000000
#define pi acos(-1.0)
#define eps 1e-8
#define seed 131
#define min(a,b) a<b?a:b
#define max(a,b) a<b?b:a
typedef unsigned long long ULL;
typedef long long LL;
using namespace std;
int n;
LL x,m;
LL Nim(LL t)
{
if(t%4==1)
return 1;
else if(t%4==2)
return t+1;
else if(t%4==3)
return 0;
else
return t;
}
int main()
{
cin>>n;
LL ans=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&x,&m);
LL u=Nim(x+m-1);
LL v=Nim(x-1);
ans^=u^v;
}
if(ans==0)
printf("bolik\n");
else
printf("tolik\n");
return 0;
}