巴什博弈

巴什博弈

  • 只有一堆 n 个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取 m个。最后取光者得胜。

必败态分析:

1.如果 n % ( m + 1 ) = = 0 n\%(m+1)==0 n%(m+1)==0,那么先手每次取 [ 1 , m ] [1,m] [1,m]中的一个数字 x x x,后手都可以取 m + 1 − x m+1-x m+1x,使得剩余的物品数量仍然满足 n 1 % ( m + 1 ) = = 0 n_1\%(m+1)==0 n1%(m+1)==0,直至当 n k = = m + 1 n_k==m+1 nk==m+1的状态下,轮到先手取数,后手必能取完最后的物品,因而获胜
2.如果 n = k ( m + 1 ) + r , ( 1 ≤ r ≤ m ) n=k(m+1)+r,(1\leq r \leq m) n=k(m+1)+r,(1rm),那么先手可以先取走 r r r个物品,就又回到了第一种情况,先手获胜

综上所述:保持给对手留下 ( m + 1 ) (m+1) (m+1)的倍数,就能获胜

例题: HDU 1846

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<queue>
#include<map>
#define ll long long
#define pb push_back
#define rep(x,a,b) for (int x=a;x<=b;x++)
#define repp(x,a,b) for (int x=a;x<b;x++)
#define W(x) printf("%d\n",x)
#define WW(x) printf("%lld\n",x)
#define pi 3.1415926535897932384
#define mem(a,x) memset(a,x,sizeof a)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int maxn=2e6+7;
const int INF=1e9;
const ll INFF=1e18;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        if (n%(m+1)==0)cout<<"second"<<endl;
        else cout<<"first"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值