题目链接:点击打开链接
题目解析:
题目为巴什博弈的模板,题目可以转化为一共有n颗石子,每次最多拿m个,先手拿走最后一颗输出Grass,否则输出Rabbit.
n颗石子,最多拿m颗,即当n == m+1的时候拿走了m颗,下一次必定为胜利,所以当一方的石子数是n%(m+1) == 0的时候这一方是必败的局势,所以有n=(m+1)*r+s(r为任意自
然数),所以拿石子的时候总是留给队手一个(m+1)的倍数即可。
#include <algorithm>
#include <iostream>
#include <numeric>
#include <cstring>
#include <iomanip>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#define LL __int64
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int INF = 0x3f3f3f3f;
using namespace std;
int main(){
int t,n,m;
scanf("%d",&t);
while(t-- && scanf("%d %d",&n,&m)){
if(n%(m+1) == 0)
puts("Rabbit");
else
puts("Grass");
}
return 0;
}
本文解析了一道关于巴什博弈的经典问题,通过分析得知,在给定的n颗石子和每次最多拿取m颗的规则下,如何确定先手是否能赢得游戏。文章提供了具体的获胜策略,并附带了一个简洁的C++实现。

265

被折叠的 条评论
为什么被折叠?



