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 } 
View Code
原文地址:https://www.cnblogs.com/ytytzzz/p/6637668.html