P2252 取石子游戏
有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。现在给出初始的两堆石子的数目,你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
这题比较狗☞,要开$long$$long$
所谓的威佐夫博弈,貌似应用的只是他的结论,两个绝绝顶聪明的人,在玩一个灰常高大上的游戏——取石子,
即给你两堆石子,两个人轮流取,可以取走其中一堆的任意一个,或取走两堆石子中的相同石子,问先手必败的条件是什么?
答案是$(b-a) imesfrac{√5+1}{2}$,满足条件且先手者必败。
#include<bits/stdc++.h> using namespace std; long long a,b; int main() { scanf("%lld%lld",&a,&b); if(a>b) swap(a,b); if((long long)((b-a)*(sqrt(5.0)+1.0)/2.0)==a) printf("0"); else printf("1"); return 0; }
转载大佬博客
几种常见博弈的总结:
一. 巴什博奕(Bash Game):
A和B一块报数,每人每次报最少1个,最多报4个,看谁先报到30。这应该是最古老的关于巴什博奕的游戏了吧。
其实如果知道原理,这游戏一点运气成分都没有,只和先手后手有关,比如第一次报数,A报k个数,那么B报5-k个数,那么B报数之后问题就变为,A和B一块报数,看谁先报到25了,进而变为20,15,10,5,当到5的时候,不管A怎么报数,最后一个数肯定是B报的,可以看出,作为后手的B在个游戏中是不会输的。
那么如果我们要报n个数,每次最少报一个,最多报m个,我们可以找到这么一个整数k和r,使n=k*(m+1)+r,代入上面的例子我们就可以知道,如果r=0,那么先手必败;否则,先手必胜。
也就是$nmod (m+1)=0$先手必败,反之先手必胜
二. 威佐夫博弈(Wythoff Game):
转上
三. 尼姆博弈(Nimm Game):
尼姆博弈指的是这样一个博弈游戏:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。
结论就是:把每堆物品数全部异或起来,如果得到的值为0,那么先手必败,否则先手必胜。
四. 斐波那契博弈:
有一堆物品,两人轮流取物品,先手最少取一个,至多无上限,但不能把物品取完,之后每次取的物品数不能超过上一次取的物品数的二倍且至少为一件,取走最后一件物品的人获胜。
结论是:先手胜当且仅当n不是斐波那契数(n为物品总数)
emmm,推荐一篇有关博弈论的文章,看着玩儿