题目描述
题解
我们先来思考只有两个棋子的问题:
- 很显然,当一个人面对两个棋子相邻的局面时,必败。
我们设 S G ( i ) SG(i) SG(i)表示两个棋子之间的距离为 i i i的 S G SG SG函数值。
S
G
(
0
)
=
0.
SG(0)=0.
SG(0)=0.
S
G
(
1
)
=
m
e
x
(
S
G
(
0
)
)
=
1.
SG(1)=mex(SG(0))=1.
SG(1)=mex(SG(0))=1.
S
G
(
2
)
=
m
e
x
(
S
G
(
1
)
,
S
G
(
0
)
)
=
2.
SG(2)=mex(SG(1),SG(0))=2.
SG(2)=mex(SG(1),SG(0))=2.
.
.
.
...
...
S
G
(
n
)
=
n
.
SG(n)=n.
SG(n)=n.
我们再思考一下当有偶数个棋子时的状况:
- 若这些棋子都两两相邻,则面对这一个局面的人必败。
证明显然。 - 因此偶数个棋子我们可以对这些棋子进行凉凉配对,那么答案一定是两两棋子件 S G SG SG值得异或和。
如果有奇数个棋子呢?将第一个棋子与 0 0 0配对即可。
代码如下:
#include <bits/stdc++.h>
using namespace std;
void work(void)
{
int n, ans = 0;
int a[20000] = {};
cin>>n;
for (int i=1;i<=n;++i) scanf("%d",a+i);
sort(a+1,a+n+1);
for (int i=n&1?1:2;i<=n;i+=2) ans ^= a[i]-a[i-1]-1;
if (ans != 0) puts("Georgia will win");
else puts("Bob will win");
return;
}
int main(void)
{
freopen("GB.in","r",stdin);
freopen("GB.out","w",stdout);
int T;
cin>>T;
while (T --) work();
return 0;
}