http://codeforces.com/problemset/problem/346/A
此题属于博弈类型的游戏;
玩法就是两个人一次从给出的序列中挑出两个数算出他们差的绝对值,如果这个数在这个序列中没有出现过则加入这个序列,知道加完。。
通过计算可知,当能得到一个1是,则能得出所有的值从1到最大值。(等差,公差为一)
否则的话,会得到一个等差数列,公差就是这个等差序列的第一个数。
所以只要得到第一个数,便可以解决此题了。。
得到第一个数我们可以通过辗转相除法,及最小公倍数就是;
#include"stdio.h"
int fun(int n,int m)
{
int r=1,t;
if(n<m)
{
t=n;
n=m;
m=t;
}
while(r>0)
{
r=n%m;
n=m;
m=r;
}
return n;
}
int main()
{
int m,n,i,p,gcd,max;
while(scanf("%d",&n)!=EOF)
{
max=-1;
scanf("%d",&gcd);
if(gcd>max)
max=gcd;
for(i=1;i<n;i++)
{
scanf("%d",&m);
if(max<m)
max=m;
gcd=fun(gcd,m);
}
p=max/gcd-n;
if(p%2!=0)
printf("Alice\n");
else
printf("Bob\n");
}
return 0;
}