0
点赞
收藏
分享

微信扫一扫

巴什博奕(Bash Game)

_铁马冰河_ 2022-06-17 阅读 284

一个游戏:A和B一起报数,每个人每次最少报一个,最多报4个。轮流报数,看谁先报到30。

比如A先报数的话,那么B一定可以赢(这里假定B知道怎么正确的报数)

B可以这样报数,每次报5-k(A)个数,其中k(A)是A报数的个数

两人报完数之后会变成5 10 15 20 25 30这样B一定会赢。比如说我们报到5(4+1),每次报最多报4个,最少报1个.那么后者一定可以赢。

那么如果我们要报到n+1,每次最多报n个,最少报1个的话,后者一定能够赢。

现在我们需要报数到n,而每次最多报数m个,最少报数1个.我们可以化成这样
n = k*(1+m)+r(0 <= r <= m)这样的话如果r不等于0那么先手一定会赢,理由:首先先手报r个,那么剩下k倍(1+m)个数,可以看成由后手先报数,报到n-r为止,那么先手就一定会赢;如果r=0那么后手一定会赢,道理一样的。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <algorithm>
using namespace std;

int main()
{
int num, limit;//num为最后报到的数,limit为最多报的数个数
scanf("%d %d", &num, &limit);
if (num%(limit+1)!=0)
printf("先手win");
else
printf("后手win");
return 0;
}


举报

相关推荐

0 条评论