题意:Nim博弈的变形,由原来的取任意多限制为最多去n/2
分析:一堆石子数量最多为1e9,显然直接用SG函数是不行的,会爆空间,然后我们来看下前20个SG函数值
很容易发现当n为偶数时有SG(n)=n/2;当n为奇数时,SG(n)=SG(n/2)自己都没发现,还是看别人的题解的时候发现的
附加SG代码代码
void getsg() {
for (int k = 1; k <= 10000; k++) {
memset(vis, false, sizeof(vis));
for (int i = 1; i * 2 <= k; i++) {
vis[sg[k-i]] = true;
}
for (int i = 0; i <= 10000; i++) {
if (!vis[i]) {
sg[k] = i;
break;
}
}
}
}
然后是AC代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main() {
int t;
scanf("%d", &t);
for (int k = 1; k <= t; k++) {
int n,m, ans = 0;
bool flag = true;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
int x;
scanf("%d", &x);
if (x & 1) {//递归到x为偶数或0
while (x) {
x /= 2;
if (x % 2 == 0) {
break;
}
}
}
ans ^= x / 2;
}
if (ans!=0){
printf("Case %d: Alice\n",k);
}
else {
printf("Case %d: Bob\n",k);
}
}
}