HDU 1846ブレイブゲーム(バッシュ

裸のBash(Bashゲーム)
トピックポータル

質問:石の山があり、石の数はnで、2人の非常に知的な人が交代でそこからいくつかの石を抽出して捨てます。各人は、ラウンドごとに少なくとも1つの石、最大でmの石を引きます。勝利の最後に石を取り終えた人は、最初のプレーヤーが勝つ必要があるのか​​、2番目のプレーヤーが最後に勝つ必要があるのか​​を尋ねます

アイデア:まず、結論を出します。n%(m + 1)== 0の場合、2番目のプレーヤーが勝ちます。そうでない場合、最初のプレーヤーが勝つ必要があります。
理由:①n%(m + 1)== 0の場合、 n = 8、m = 3などの小さな例では、最初に最初の手をとることができます。たとえば、1をとると、次に3をとることができ、最初の手が1/2/3をとるかどうかは関係ありません。 、4を終えることは不可能であり、次に対戦相手がしなければならないときにそれを取ることができるので、この場合、2番目のプレーヤーが勝ちます。
初めて1をとらない、2をとる、2をとる、FLACも2をとる、FLACも2をとる、状況の残りの4つの石に戻らない、と言う人もいるかもしれません。 3、結果は同じな
ので、このモデルの方程式が成り立つ場合、最初の手が何をとっても、秒の手はいくつかを描くことができるので、残りの石の数は方程式を満たします。このように繰り返すと、最初の手は失う。
②この式が成り立たない場合、例えばn = 10、m = 3の場合、最初に2つ取って①の状況に変えることができますが、現時点では石を取るのは初めてではありません。 、しかし、石を取るための秒針、それで現在の状況2番目のプレーヤーは負けなければなりません。
コードは以下のように表示されます

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
//const int N = 2e5+10;
//int a[N];

signed main()
{
    
    
    int t,n,k;
    cin>>t;
    while(t--){
    
    
        cin>>n>>k;
        if(n%(k+1)==0) cout<<"second"<<endl;
        else cout<<"first"<<endl;
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/YSJ367635984/article/details/113748635