問題バレーP1290 [ユークリッドゲームにロサンゼルス・ソリューション

この問題は、そんなに手間を必要としなかった、あなただけの推論を見てする必要があります。

我々は、2つの数があると\(X、Y \)を最初に、(X \)\、大きな値に設定されている\(Y- \)は小さい値に設定されています。今、3つのケースに分け:

\(1 \) 数は、2つの関係、1つの勝利操作の倍数である場合。

\(2 \)。2つの商あれば\(> 1 \) それはまだ勝利のパーティーを操作しています。

\(なぜ?\)

たとえば取る\(25,7 \)です。この場合の動作側は3つのオプションを有している(\ 18 \) \(7 \)、\ (11 \) \(7 \)、\ (4 \) \(7 \)

彼が選択した場合は(\ 18 \)を \(7 \) 次いで、後者が直面するだろう\(11 \) \(7 \)または\(4 \) \(7 \) そして彼が選択しない場合を\ (18 \) \(7 \) その後、彼の顔や\(11 \) \(7 \)または\(4 \) \(7 \)

この時点でいることがわかります(\ 11)を\ \(7 \)\(4 \) \(7 \)は勝たなければならないが、両方のスマート十分、そうできるようになるユーザーを選択する権利を有する者です勝ちます!彼は選ぶことができない\(18 \)を (7 \)\

再び栗を与える:\(31 \)を \(6 \)

次に、あなたは、ちょうどパーティーのみのオプションを取得ございます\(7 \) \(6 \)または\(1 \) \(6 \)明らかに彼の手の制御を確実に、これだけに\(1 \) \(6 \)十分ではありません、あなただけ選択することができます\(7 \)を (6 \)\したがって\(7 \) \(6 \) \( - \) \(6 \) \(1 \) \( - \) \(6 \) \(0 \) 結果は、勝つために優勢です!

次に、あなたが知っておくべきこと:選択する権利を持っている人(二つ以上を選択)勝つ誰が!

\(3 \) 商がある\(1 \) 継続

ような栗の場合、(6 \)\ \(4 \) その後、上側のハンドない選択、それだけとして、主張し続ける(2 \)\ (4 \)\

\(コード:\)

#include<bits/stdc++.h>
using namespace std;
bool check(int x,int y){
    for(int i=1;;i++){
        int ma=max(x,y);
        int mi=min(x,y);
        x=ma,y=mi;
        //x为两数较大值,y为两数较小值 
        if(x%y==0){
            return i%2;//若两数为倍数关系,操作的一方赢
        }else if(x/y>1){
            return i%2;//若两数商>1,那么还是操作一方赢
        }else{
            x-=y;//否则说明商为1,那就继续 
        }
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        if(check(x,y))cout<<"Stan wins"<<endl;
        else cout<<"Ollie wins"<<endl;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/Agonim/p/12080772.html