巴什博弈

巴什博弈

  • 只有一堆 n 個物品,兩個人輪流從這堆物品中取物,規定每次至少取一個,最多取 m個。最後取光者得勝。

必敗態分析:

1.如果n%(m+1)==0n\%(m+1)==0,那麼先手每次取[1,m][1,m]中的一個數字xx,後手都可以取m+1xm+1-x,使得剩餘的物品數量仍然滿足n1%(m+1)==0n_1\%(m+1)==0,直至當nk==m+1n_k==m+1的狀態下,輪到先手取數,後手必能取完最後的物品,因而獲勝
2.如果n=k(m+1)+r,(1rm)n=k(m+1)+r,(1\leq r \leq m),那麼先手可以先取走rr個物品,就又回到了第一種情況,先手獲勝

綜上所述:保持給對手留下(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章