Industrial Nim
http://codeforces.com/contest/15/problem/C
题意:
现有n个采石场,第i个采石场有mi堆石子
各堆分别有xi,xi+1……,xi+m-1颗石子
两名选手使用最优策略进行Nim游戏,双方轮流操作
每次操作为从任意一堆石子取出任意数量的石子,不能操作者败
现对于一初始局面,先手必胜输出“tolik”,否则输出“bolik”(不含引号)
解法:
显然核心算法仍然是Nim
然后用脑子想想
f(x)表示1-x的异或和怎么求就好了
其实怎么求都可以,想清楚就好了
1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 typedef long long ll; 7 8 ll f(ll x) { 9 ll res = 0, cnt; 10 for(ll i = 1;i <= x;i <<= 1) { 11 cnt = x / (i << 1) * i; 12 if(x % (i << 1) >= i) cnt += x % (i << 1) - i + 1; 13 if(cnt & 1) res |= i; 14 } 15 return res; 16 } 17 18 int main() { 19 int t; 20 ll m, x, ans = 0; 21 cin >> t; 22 while(t --) { 23 cin >> x >> m; 24 ans ^= f(m + x - 1) ^ f(x - 1); 25 } 26 puts(ans ? "tolik" : "bolik"); 27 return 0; 28 }