题意:
两个人从集合中取数,任意取出两个不同的数,集合中不能包含取出数的 |x-y|,如果谁取出的两个数字中的 |x-y|在集合中,那么这个人就
输了,输出获胜一方的名字。
输入:
2 2 3
2 5 3
3 5 6 7输出:
Alice
Alice
Bob
分析:
游戏结束的标志是无法取出两个不同的数,即无论取出那两个数字,他们的绝对差都在集合中,换句话说,最终状态就是一个首项
等于公差的等差数列,求出这个数列的项数减 n 就是游戏进行的回合数。所以我们要先求出首项。设首项为d,接下来d+d,d+2d….后面几项都是首项的倍数,所以我们可以用gcd(a1,a2,a3…an)求出。ans = an / gcd(a1,a2..an) - n;求出游戏的回合数之后本着
ABAB....的情况输出获胜一方就可以。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[105];
int gcd(int x, int y)
{
return y?gcd(y,x%y):x;
}
int main()
{
int n, t = 0;
cin >>n;
for (int i = 0; i < n; ++i)
{
cin >>a[i];
t = max(t, a[i]);
}
int maxn=t;
for(int i=0; i<n-1; i++)
{
for(int j=i+1; j<n; j++)
{
int l=gcd(a[i], a[j]);
t=gcd(t,l);
}
}
int k=maxn/t-n;
puts(k & 1 ? "Alice" : "Bob");
return 0;
}