codeforces 15c 博弈

题意:现有n个采石场,第i个采石场有mi堆石子,各堆分别有xi,xi+1……,xi+m-1颗石子。两名选手使用最优策略进行Nim游戏,双方轮流操作,每次操作为从任意一堆石子取出任意数量的石子,不能操作者败。现对于一初始局面,先手必胜输出“tolik”,否则输出“bolik”(不含引号)。

题解:根据Nim的结论,所有数异或一下即可,然而这些数比较大,所以再做个优化

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 123456;

ll n;
ll a[N], b[N];
int main(){
	while(cin >> n){
		ll ans = 0;
		for(ll i = 1; i <= n; i ++) {
			cin >> a[i] >> b[i];
			ll endd = a[i] + b[i] - 1;
			if(a[i] & 1) {
				ans ^= a[i];
				a[i] ++, b[i] --;
			}
			if(b[i]) {
				ll siz = b[i] >> 1;
				if(siz & 1)ans ^= 1;
				if(b[i] & 1)ans ^= endd;
			}
		}
		ans ? puts("tolik") : puts("bolik");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86560521
今日推荐