この問題は、そんなに手間を必要としなかった、あなただけの推論を見てする必要があります。
我々は、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;
}