题目
源地址:
http://codeforces.com/problemset/problem/15/C
理解
有n个矿场,第i个矿场有mi辆矿车,第一辆矿车有xi颗石头,第二辆xi+1颗,如此递推,直到第mi辆有mi+xi-1颗。然后有两个人轮流取石头(金矿?),他们可以选择任意一个矿场任意一辆矿车取走任意非0数量的石头,直到第一个不能再取的人认输。 实际上,这就是一个裸的Nim博弈问题,只要直接运用结论就能完成解答。但是问题在于,数据太多,导致每一个全都异或起来的话耗时太长。所以需要采用一些手段处理一下。我们需要用到两个结论:第一,从1异或到n的答案存在着这样一个特性:n%4==1时,答案为1;n%4==2时,答案为x+1;n%4==3时,答案为0;n%4==4时,答案为x。第二,从x异或到y的值等于nim(x-1)^nim(y)。 经过上述的处理,最后的结果就出来了~
代码
#define MAXN 100000+10
ll n,x,m,ans=0;
ll nim(ll x)
{
ll tmp=x%4;
if(tmp==1)
return 1;
else if(tmp==2)
return x+1;
else if(tmp==3)
return 0;
else
return x;
}
int main(int argc, char const *argv[])
{
scanf("%I64d", &n);
while(n--)
{
scanf("%I64d %I64d", &x, &m);
m=nim(m+x-1);
x=nim(x-1);
ans^=x^m;
}
ans?puts("tolik"):puts("bolik");
return 0;
}
更新日志
- 2014年11月26日 已AC。