歐幾里得遊戲

題目:
        一開始,黑板上寫有兩個不相等的正整數,兩個玩家交替寫數字,每一次,當前玩家都必須在板上寫出任意兩個板上數字的差,而且這兩個數字必須是新的,也就是說,不能與板上任何一個已有的數字相同。當玩家再也寫不出新數字時,他就輸了。請問,你是選擇先行動還是後行動呢?


分析:
        其實這道題和歐幾里得算法的減法版本有點像,只是有點拓展,無論他們怎麼相減,最後肯定會得到最大公約數,假設最大公約數爲m,那麼兩個正整數就是a = im, b = jm,既然得到了m,爲了得到不同的數字,他們只能把所有m的倍數都寫出來(有了一倍的情況,即m,肯定能得到其它倍數的情況km),最後他們得到的數字個數一定是:max(i, j)(包括最開始的2個數在內)。
        因此,要判斷先手還是後手,就取決於max(i, j) - 2的結果是奇數或偶數,奇數就先手,偶數就後手。


答案:

        求得max(a, b) / gcd(a, b) - 2的結果,結果爲奇數,先手;結果爲偶數,就後手。

代碼如下:

#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b){return a%b==0?b:gcd(b,a%b);}
int main(){
	int a,b,c,yue,flag;
	cin>>a>>b;
	c=max(a,b);
	yue=gcd(a,b);
	flag=c/yue-2;
	if(flag%2)cout<<"behind\n";
	else cout<<"before\n";
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章