经典博弈

来源:互联网 发布:2016网络知识竞赛 编辑:程序博客网 时间:2024/06/01 09:04


巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规
定每次至少取一个,最多取m个。最后取光者得胜。

如果n%(m+1)==0,先手输。

威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同
时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

设堆中物品少的为a,多的为b,如果a==(b-a)*(1+sqrt(5.0))/2,先手输。

  1. LL tmp[3] = {618033988,749894848,204586834};  
  2. LL MOD = 1000000000;  
  3. int main()  
  4. {  
  5.     int T;  
  6.     LL m, n;  
  7.     cin>>T;  
  8.     while(T--)  
  9.     {  
  10.         cin>>m>>n;  
  11.         if(m < n)  
  12.             swap(n, m);  
  13.         LL cha = m - n;  
  14.         LL ta = cha/MOD, tb = cha%MOD;  
  15.         LL tp = tb*tmp[2];  
  16.         tp = ta*tmp[2] + tb*tmp[1] + tp/MOD;  
  17.         tp = ta*tmp[1] + tb*tmp[0] + tp/MOD;  
  18.         tp = cha + ta*tmp[0] + tp/MOD;  
  19.         if(tp == n)  
  20.             puts("B");  
  21.         else  
  22.             puts("A");  
  23.     }  

尼姆博奕(Nimm Game):有n堆各若干个物品,两个人轮流从某一堆取任意多的
物品,规定每次至少取一个,多者不限,最后取光者得胜。

所有堆的异或和==0,先手输。


0 0