题意:现有n个采石场,第i个采石场有mi堆石子,各堆分别有xi,xi+1……,xi+m-1颗石子。两名选手使用最优策略进行Nim游戏,双方轮流操作,每次操作为从任意一堆石子取出任意数量的石子,不能操作者败。现对于一初始局面,先手必胜输出“tolik”,否则输出“bolik”(不含引号)。
题解:简单尼姆博弈 x^(x+1)^...^(x+m-1)=f(x-1)^f(x+m-1)
f(n)=1^2^3^...^n
按位算f(n)即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll f(ll t){
ll now=0,ts=1,ans=0;
ll d=t%4;
if(d==1||d==2)ans=1;
ts=2;
while(ts<=t){
now=0;
ll d=t-ts+1;
d=d%(ts*2);
if(d<=ts&&d%2)now=1;
ans+=now*ts;
ts*=2;
}
return ans;
}
int main(){
ll i,j,n,x,k,now=0;
scanf("%lld",&n);
for(i=1;i<=n;i++){
scanf("%lld%lld",&x,&k);
now^=f(x-1)^f(x+k-1);
}
if(now)printf("tolik\n");
else printf("bolik\n");
return 0;
}