可以老老实实用 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;
}