F. Stone 题解(对称博弈)
题目链接
题目思路
这个写法感觉有点天才,当作记录一下吧
其实越复杂的博弈好像其实最后的结论越简单?
放下官方题解
题意:轮流拿石头,每个人先确定一个上次选的数字的因数
s,然后再选择若干堆同时拿走 s 个石头,问先手有多少种
第一步的方案数使得先手必胜。
考虑这样一种局面:存在某堆石头的数量是奇数。那不管是
先手还是后手,选择 s = 1(奇数) 先把所有堆变成偶数个,
然后对手也只能 s = 1(奇数),模仿对面拿法即可。
换言之,如果所有堆都是偶数,则不管是谁都不能选 s 为奇
数,否则变成前面一种情况,对手必胜。即 s 只能为偶数,
此时堆数量 / = 2,转化为相同的问题。
那么一直除以 2,总会在某个时候出现某个石头堆有奇数
个,转换为前面的局面。
此时答案为 (最小奇数+1)/2。
代码
#include
#define fi first
#define se second
#define debug cout<<"I AM HERE"<