题意:两个人从n堆石子中取石子。规则如下:1.任选一堆,取一个或取多个。2.取完石子后,你可以选择是将该堆石子分成两堆,还是不分。取完最后一个石子的人为胜者。问先手能否必胜。
思路:直接sg函数打表,发现和最原始的nim博弈是等价的。证明待补。
代码如下:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 20000;
int main(void)
{
//freopen("input.txt","r",stdin);
int T,N;
int tmp;
while(scanf("%d",&N) != EOF){
int ans = 0;
for(int i = 0; i <N; ++i){
scanf("%d", &tmp);
ans ^= tmp;
}
if(ans == 0) puts("Lose");
else puts("Win");
}
return 0;
}
/*int SG(int n)
{
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; ++i){
int t = n - i;
vis[sg[t]] = true;
for(int j = 1; j < t; ++j)
vis[sg[j] ^ sg[t - j]] = true;
}
int i = 0;
for(;vis[i];++i);
return sg[n] = i;
}*/