又見Alice and Bob
阿新 • • 發佈:2018-11-12
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; }