題目描述
小明和小紅在玩歐幾里得游戲。他們從兩個自然數開始,第一個玩家小明,從兩個數的較大數中減去較小數的盡可能大的正整數倍,只要差為非負即可。然后,第二個玩家小紅,對得到的兩個數進行同樣的操作,然后又是小明。就這樣輪流進行游戲,直至某個玩家將較大數減去較小數的某個倍數之后差為0為止,此時游戲結束,該玩家就是勝利者。
輸入
輸入包含多組測試數據。每組輸入兩個正整數,表示游戲一開始的兩個數,游戲總是小明先開始。
當輸入兩個0的時候,輸入結束。
輸出
對於每組輸入,輸出最后的勝者,我們認為他們兩個都是頂尖高手,每一步游戲都做出了最佳的選擇。
具體輸出格式見輸出樣例。
樣例輸入
34 12
15 24
0 0
樣例輸出
xiaoming wins
xiaohong wins
兩句話,能轉移到必敗點的是必勝點,只能轉移到必勝點的是必敗點。
我是這么推出來的,或者從定理出發,一個點不是必敗點就是必勝點,對三角形右下角分別假設,都可以推出m/n>2必勝
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int main(){
while(scanf("%d%d",&n,&m)==2&&n&&m){
if(n>m) swap(n,m);
bool flag=true;
while(m%n!=0&&m/n==1){
m-=n;
if(n>m) swap(n,m);
flag=!flag;
}
if(flag){
printf("xiaoming wins\n");
}
else printf("xiaohong wins\n");
}
return 0;
}