NOI2.5.6266採石ゲーム問題解(C++)
NOI2.5.6266採石ゲーム問題解(C++)
タイトル
6266:石取りゲーム
総Time Limit:1000 ms Memory Limit:65536 kB
Descriptionには石が2つあるので、二人で交代で取りに行きます.取るたびに、多くの石から取るしかなく、取る数は少ない石の数の整数倍でなければならない.最後に誰が石の山を空にすることができて、誰が勝っても勝つことができます.例えば最初の2つの石の数は25と7です
25 7-->11 7-->4 7-->4 3-->1 3-->1 0選手1取選手2取選手2取選手1取選手1取選手
最後に選手1(先取の)が優勝し、取る過程で選手2は唯一の取り方しかなかった.最初の時の石の数を指定して、もし二人とも最良の策略を取ったら、先手が勝つかどうか聞いてください.
Input入力には多数のデータが含まれています.各データのセットの1行は、2つの正の整数aとbを含み、初期の石の数を表す.入力は2つの0で終わります.
Outputは先手で勝てば「win」、そうでなければ「lose」を出力します
Sample Input 34 12 15 24 0 0
Sample Output win lose
Hintは、石の数が(a,b)でa>=bであると仮定する、[a/b]>=2であれば先手が必ず勝つ、[a/b]<2であれば先手は唯一の取り方しかない.[a/b]は、aをbで割る整数値を表す.
構想
この問題はヒントがあって、これはとても心地良くて、全体的に深く探して乾かしますで終わります
コード#コード#
タイトル
6266:石取りゲーム
総Time Limit:1000 ms Memory Limit:65536 kB
Descriptionには石が2つあるので、二人で交代で取りに行きます.取るたびに、多くの石から取るしかなく、取る数は少ない石の数の整数倍でなければならない.最後に誰が石の山を空にすることができて、誰が勝っても勝つことができます.例えば最初の2つの石の数は25と7です
25 7-->11 7-->4 7-->4 3-->1 3-->1 0選手1取選手2取選手2取選手1取選手1取選手
最後に選手1(先取の)が優勝し、取る過程で選手2は唯一の取り方しかなかった.最初の時の石の数を指定して、もし二人とも最良の策略を取ったら、先手が勝つかどうか聞いてください.
Input入力には多数のデータが含まれています.各データのセットの1行は、2つの正の整数aとbを含み、初期の石の数を表す.入力は2つの0で終わります.
Outputは先手で勝てば「win」、そうでなければ「lose」を出力します
Sample Input 34 12 15 24 0 0
Sample Output win lose
Hintは、石の数が(a,b)でa>=bであると仮定する、[a/b]>=2であれば先手が必ず勝つ、[a/b]<2であれば先手は唯一の取り方しかない.[a/b]は、aをbで割る整数値を表す.
構想
この問題はヒントがあって、これはとても心地良くて、全体的に深く探して乾かしますで終わります
コード#コード#
#include
using namespace std;
int n,m;
void dfs(int a,int b,int step){// ,a ,b ,step
if(a%b==0||a/b>=2){// : , a/b>=2 , a%b==0 ,
if(step%2==1){// step
cout<<"win"<<endl;
return;
}else{//
cout<<"lose"<<endl;
return;
}
}
dfs(b,a%b,step+1);
// a ,a%b a b
// , b , a
}
int main(){
while(cin>>n>>m){
if(n==0||m==0){
return 0;// n,m 0,
}
if(n<m){
swap(n,m);// n
}
if(n/m>=2){//
cout<<"win"<<endl;
}else{
dfs(n,m,1);
}
}
return 0;
}