题意:在nim游戏的规则上再增加了一条,即可以将任意一堆分为三堆都不为0的子堆也视为一次操作。
分析:打表找sg值的规律即可。
感想:又学会了一种新的方法,以后看到sg值找不出规律的,就打表即可~
打表代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <set>
using namespace std; int sg[+]; int main()
{
sg[] = ;
for(int i=;i<=;i++)
{
set<int> S;
for(int j=;j<i;j++) S.insert(sg[j]);
for(int a=i-;a>;a--)
{
for(int b=a;b>;b--)
{
for(int c=a;c>;c--)
{
if(a+b+c == i)
{
S.insert(sg[a]^sg[b]^sg[c]);
}
}
}
}
int now = ;
while(S.count(now)) now++;
sg[i] = now;
printf("sg[%d] = %d\n",i,now);
//if(sg[i] != i) printf("sg[%d] = %d\n",i,now);
}
}
AC代码如下:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = (int)1e6 + ; int main()
{
int T;scanf("%d",&T);
while(T--)
{
int n;scanf("%d",&n);
int temp = ,now;
for(int i=;i<=n;i++)
{
scanf("%d",&now);
if(now% == )
{
temp ^= (now-);
}
else if(now% == )
{
temp ^= (now+);
}
else temp ^= now;
}
puts(temp?"First player wins.":"Second player wins.");
}
}