然而,他们很快厌倦了这种完美的策略,并设计了一种新的游戏——S-Nim。在 S-Nim 中,每次只能从预定义集合 S 中选择一个数值来移除相应数量的珠子。因此,不再是所有情况下都能将 XOR 值调整为 0。
### 输入输出要求 输入包含多个测试用例,每个测试用例包括两部分: 1. 第一部分是集合 S 的定义,其中 k 表示集合大小,随后列出 k 个整数 si,表示允许移除的珠子数量。 2. 第二部分是 m 个位置评估,每行开头是一个整数 l 表示堆的数量,后面跟着 l 个整数 hi 表示每堆的珠子数量。
以下是 C++ 代码实现: ```cpp #include #include #include #include #include using namespace std; int sg[10005]; int f[110]; void getsg(int n) { memset(sg, 0, sizeof(sg)); bool hash1[10005]; // 必须用 bool 定义,不然会超时。 for (int i = 0; i <10005; i++) { memset(hash1, 0, sizeof(hash1)); for (int j = 0; j if (i - f[j] >= 0) hash1[sg[i - f[j]]] = 1; } for (int j = 0; j <10005; j++) { if (!hash1[j]) { sg[i] = j; break; } } } } int main() { int n; while (scanf("%d", &n) != EOF && n != 0) { for (int i = 0; i scanf("%d", &f[i]); sort(f, f + n); getsg(n); int m; scanf("%d", &m); for (int i = 0; i int t; int pp; int res = 0; scanf("%d", &t); for (int j = 0; j scanf("%d", &pp); res ^= sg[pp]; } if (res == 0) printf("L"); else printf("W"); } printf("\n"); } return 0; } ```