版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
游戏规则: 有n个石子,两个人轮流取,取1,2,k个,取完胜
结论:
(1)若k%3 == 0,则n %= k + 1,若n == k,则a胜,否则忽略k转为巴什博弈。
(2)若k%3 == 1 或者 == 2,直接忽略k转为巴什博弈。
证明:
情况1,将n分为n / (k + 1)堆的k+1和n%k+1的一堆。若对手取k或1,我都能使得这一回合取完k+1。若对手取2,我取2,这一轮的效果和取完k+1的效果是一样的,因为对于k-4的这一堆,对手无法使用k,那么我取要取完这一堆只要以3的倍数下降即可。所以策略为:我先尽量取完n%k+1的那一堆,对手取2时我取1,当然开始时先把余数取完。若对手不取2,我就可以消去k+1的一堆。当n%k+1的那一堆取完时,若对手还取2,我就取2。那么k-4的一堆又变成了3的倍数,用对付n%k+1的那一堆的方法解决即可。当然如果n%k+1为k,一开始直接取k即可。
情况2,k的作用与1或2的作用相同,忽略k即可。
/*
(1)若k%3 == 0,则n %= k + 1,若n == k,则a胜,否则忽略k转为巴什博弈。
(2)若k%3 == 1 或者 == 2,直接忽略k转为巴什博弈。
*/
#include <cstdio>
int main()
{
int t;
scanf("%d",&t);
while( t-- )
{
int n,k;
scanf("%d%d",&n,&k);
if( k % 3 )
{
if( n % 3 ) printf("Alice\n");
else printf("Bob\n");
}
else
{
n %= (k+1);
if( n == k ) printf("Alice\n");
else if( n % 3 ) printf("Alice\n");
else printf("Bob\n");
}
}
return 0;
}
巴什博弈的推广,同样若可取范围为[1,m],k,也可用同样策略。