1. 程式人生 > >又見Alice and Bob

又見Alice and Bob

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=788

描述

集訓生活如此乏味,於是Alice和Bob發明了一個新遊戲。規則如下:首先,他們得到一個集合包含n個特定的整數,接著他們輪流做以下操作,每一次操作,Alice或者Bob(輪到誰就是誰)會從集合中選擇兩個整數x 和 y ,(但是集合中不能包含| x - y|),接著他就會把整數|x - y| 加入集合,因此,集合中的資料多加了一個……

如果當前玩家不能執行操作了,他就輸了。問題是如果Alice和Bob都很聰明的情況下,誰能獲勝呢?Alice是首先執行操作。

輸入

多組測試資料,每組測試資料包含兩行。
第一行一個整數n( 2 <= n <= 110),初始集合包含元素的個數
第二行依次輸入n個數a1,a2……an,(1 <= ai <= 10^9)以空格分開,代表集合元素。

輸出

如果Alice 獲勝輸出 “Alice”,否者輸出“Bob”

樣例輸入

3
3 4 5

樣例輸出

Bob

這道題就像輾轉相除法,兩個數相減,直到不能減為止,找出給出資料的最大值和公約數,在最大值區間有多少公約數的倍數,當然要把給出的數去掉,如果為單數,Alice勝,否則Bob勝。

#include<stdio.h>

#define N 120
int a[N];
int gcd(int a,int b)
{
	int t;
	if(b>a)
	{
		t=a;
		a=b;
		b=t;
	}
	while(b)
	{
		t=a%b;
		a=b;
		b=t;
	}
	return a;
}
int main()
{
	int max,n,i,g,flag;
	while(scanf("%d",&n)!=EOF)
	{
		max=0;
		for(i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
			if(a[i]>max)
				max=a[i];
		}
		g=a[0];
		for(i=1;i<n;i++)
			g=gcd(g,a[i]);
		if((max/g-n)%2)
			printf("Alice\n");
		else
			printf("Bob\n");
	}
	return 0;
}