博弈笔记
Bash 博弈
简单说的话,经典的说法是:有一堆石子,总计数为 N,两个人轮流取石子,最多每人次取 K个,最少也要拿一个,规则是取得最后一个石子的人是赢家,现在告诉问最后谁是赢家。
这个问题呢,要这么去想,
1. 假设现在 N = K + 1,那么因为一次最多最多拿走 K 个,所以肯定是后手赢得比赛。
2. 假设现在 N = (K + 1) * P + S,也就是现在的石子数目是K+1的倍数,加一个余数的形式(余数可能为0,此时后手取胜),那么只要保证两个人每一个回合加起来取得石子数目是K + 1,也就是始终可以写成是K + 1的倍数,则最后总是先手的。
3. 总结一下就是,只要给对手留下的是 K + 1 的倍数,自己就可以获胜。因为只要给对手的是 K + 1 的整数倍,那么就可以维护住这个态势,最后一个石子留给自己
必胜态:只要 N 无法整除 K + 1 ,就是先手获胜,否则后手获胜。
简单套路 : https://vjudge.net/problem/HDU-1846
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1066
威佐夫博奕
威佐夫博奕是这样的,有两堆各若干的物品,两个人轮流从某一堆或者同时从两堆中间取出同样多的物品,规定每一次最少在一堆中取一个,不设上限,最后取光着判胜。
这个题目呢,要这么去分析,
首先我们用数对的方式来表示当前的两堆物品的数量分布,如果是某一方得到(0,0)的分布,则判负,我们可以得到,前几个判负分布分别是:(0,0) 、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)……
这样来的话,我们可以知道,如果a, b写成通项的话,有这么一个事情,就是如果我假设a0 和b0 的首项是0的话, ak这一项是没有在前面出现的最小项,而bk 就是ak + k;
必胜态 : 如果满足 ak=k∗(1+√5)/2,bk=ak+k ,后手必胜,否则前手必胜。