题解:P16264 [蓝桥杯 2026 省 Python B 组] 奇偶博弈
题目传送门:P16264 [蓝桥杯 2026 省 Python B 组] 奇偶博弈
题目分析:
本题是一个公平组合游戏(Impartial Combinatorial Game),给定一个全部由正奇数构成的数列
每次操作:
选择一个大于
将其替换为一个严格小于它的非负整数
奇偶限制:
若
若
无法操作者输。
由于初始全是奇数,第一步必然将某个奇数变为偶数。之后偶数可以一步步减小(每次变为更小的偶数),直到
思路:
每个数独立一次只改变一个数,整个游戏是多个子游戏的和(Nim 和)。
奇数操作固定:奇数
偶数操作灵活:偶数
这等价于:你可以一次拿走任意偶数颗石子(包括全部)。
因此,每个偶数的子游戏就是:
一堆石子,每次可以拿走偶数颗,不能拿者输。
这是一个经典的偶数取子游戏。
SG函数的推导
偶数的 SG 值:
设
边界:
对于
计算得:
归纳可得:
g(e) =
奇数的 SG 值:
设
当
当
因此:
那么,整体的SG函数值为
初始数列全为奇数,每个数的 SG 值为:
- 若
W_i = 1 ,SG 值为1 。 - 若
W_i \ge 3 ,SG 值为0 。
整体 SG 值为所有
其中
胜负判定:
若
若
由于
算法步骤
读入测试用例组数
对于每组测试用例:
读入
遍历
若
时间复杂度
代码实现:
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int cnt = 0;
for (int i = 1;i <= n;i++) {
int w;
cin >> w;
if (w == 1) cnt++;
}
if (cnt % 2 == 1) cout << "L" << endl;
else cout << "Q" << endl;
}
return 0;
}