#COCR题解 | Stone
2025-09-07 14:59:13
发布于:上海
16阅读
0回复
0点赞
分析
题目:地上有 堆石子(第 堆石子的数量为 ),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如 FM 是先手,且告诉你这 堆石子的数量,他想知道是否存在先手必胜的策略。若 FM 必败,则额外算出若添加一堆石子可以使 FM 必胜,那么这堆石子的数量 至少是多少。
如果学过,肯定能一眼看出这是一道经典的 Nim 博弈题目。
Nim博弈的胜负由所有堆石子数的异或和 决定:
- 若 ,先手可通过策略(从某堆取走若干石子,使新的异或和为 )保证必胜;
- 若 ,无论先手如何取,后手都能将异或和重新变为 ,因此先手必败。
当 (先手必败)时,添加一堆石子 需满足:新的异或和 。
由于原 ,因此 。要使 且 最小,故取 ( 是最小的正整数,且 )。
关于更多有关 Nim 博弈的知识,可以前往 OI Wiki 查阅,这里不过多介绍。
代码
#include <iostream>
using namespace std;
int t,n,a,sum;
int main() {
cin >> t;
while (t--){
sum = 0;
cin >> n;
for (int i = 0;i < n;i++){
cin >> a;
sum ^= a;
}
if (sum != 0) {
cout << "Yes" << endl;
} else {
cout << "No 1" << endl;
}
}
return 0;
}
2025 年 09 月 07 日 版本 1
这里空空如也
有帮助,赞一个