1. 程式人生 > >HDU 1847 Good Luck in CET-4 Everybody! 巴什博弈

HDU 1847 Good Luck in CET-4 Everybody! 巴什博弈

傳送門

可以老老實實用 SG 函式求出來這個是常規解法

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2050;
int sg[maxn];
int used[maxn];
void getsg() {
	sg[0] = 0;
	for (int i = 1; i < 1001; ++i) {
		for (int t = 1; t <= i; t*=2) {
			used[sg[i-t]] = i;
		}
		for (int k = 0; ;++k) {
			if (used[
k] != i) { sg[i] = k; break; } } } } int main() { getsg(); int n; while (cin >> n) { if (sg[n]) cout << "Kiki" << endl; else cout << "Cici" << endl; } return 0; }

但是如果玄學你一點你會發現 n%3 == 0 的時候會輸, 其他情況都會贏。
若果你手裡的牌是 3的倍數, 那麼取完之後 %3 是 1 或者 2, 對手一定可以取 1 或者 2 恢復 3 的倍數。這樣下去你就輸了。
如果 n % 3 != 0你就可以取 1 或者 2 把它變成 3 的倍數,這樣對手就輸了。

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

int main() {
	int n;
	while (cin >> n) {
		if (n%3)
			cout << "Kiki" << endl;
		else
			cout << "Cici" << endl;
	}
	return 0;
}