Bachet 游戏
2025-10-23 23:06:50
发布于:山东
5阅读
0回复
0点赞
这个题就是Bachet 游戏
结论:当且仅当 时先手必败,这个式子的意义是 除以 的余数是0。下面我们来准备证明一下,但我们的证明围绕了一个好东西:
如果一种游戏的最终局面(某一方输)满足某一性质,并且游戏中所有满足该性质的局面所能创造出的新局面都不满足该性质,同时所有不满足该性质的局面一定可以产生出至少一个满足该性质的局面,那么我们就可以根据最初局面是否满足这个性质来判断先手是否必胜。
证明:
首先发现最终局面是没有石子先手输了,显然此时满足结论。
当一个局面不符合时对应玩家可以取走这个余数数量的石子,显然数量上是合法的,后手会面临满足性质的局面
当一个局面满足性质的时候就一定不可能通过拿石子来得到,因为这样至少需要拿 个,不合法。
okk,证明结束,接下来就是代码了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define ll long long
//#define int long long
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
#define rop(i,a,b) for(int i=(a);i<(b);++i)
#define rep(i,a,b) for(int i=(a);i>(b);--i)
using namespace std;
int iread(){int x=0,y=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}while('0'<=c&&c<='9'){x=(x<<3)+(x<<1)+(c^'0');c=getchar();}return x*y;}
ll lread(){ll x=0,y=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}while('0'<=c&&c<='9'){x=(x<<3)+(x<<1)+(c^'0');c=getchar();}return x*y;}
signed main(){int T=iread();while(T--){
int n=iread();
int m=iread();
if(n%(m+1)) puts("Win");
else puts("Lose");
}return 0;}
全部评论 1
ddd
1周前 来自 山东
0







有帮助,赞一个