Description
聪聪和睿睿最近迷上了一款叫做分裂的游戏。 该游戏的规则试: 共有 n 个瓶子, 标号为
Solution
SG定理的基本应用吧。SGi表示第i个瓶子中的豆子,接下来就是套
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 30000;
const int N = 30;
bool vis[MAXN];
int a[N], SG[N];
int test, G, cnt, n;
int main(void) {
freopen("1.in", "r", stdin);
scanf("%d", &test);
for (int i = 1; i < 28; i++) {
memset(vis, 0, sizeof vis);
for (int j = 0; j < i; j++)
for (int k = 0; k <= j; k++)
vis[SG[j] ^ SG[k]] = true;
for (int j = 0; ; j++)
if (!vis[j]) {
SG[i] = j; break;
}
} // 预处理SG函数
while (test--) {
scanf("%d", &n); G = cnt = 0;
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 0; i < n; i++)
if (a[i] & 1) G ^= SG[n - i - 1];
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
for (int k = j; k < n; k++)
if ((G ^ SG[n - i - 1] ^ SG[n - j - 1] ^ SG[n - k - 1]) == 0)
if ((++cnt) == 1) printf("%d %d %d\n", i, j, k);
if (!cnt) puts("-1 -1 -1");
printf("%d\n", cnt);
}
return 0;
}