从一个集合里面选两个数,x,y 把|x - y|的绝对值加进去,如果|x-y|的绝对值不能被加进去的话那个人就输了。
找到所有数的最大公约数,设为k
那么所有数就可以表示成为a1 * k,a2 * k,a3 * k....an * k.(假设an最大)
所以加进去的数一定是m * k (1 <= m <= an)
所以看1,an有多少个数,如果有奇数个就一定是Alice赢,否则Bob
AC代码:
#include <cstdio>
#include <string.h>
const int MAX_NUMBER = 105;
int value[MAX_NUMBER];
int n;
int gcd(int a, int b) {
if (b == 0) {
return a;
}
else return gcd(b, a % b);
}
int main() {
scanf("%d", &n);
int max_number = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &value[i]);
if (value[i] > max_number) {
max_number = value[i];
}
}
int large_gcd = value[1];
for (int i = 2; i <= n; i++) {
large_gcd = gcd(large_gcd, value[i]);
}
int number = max_number / large_gcd;
number -= n;
if (number % 2) {
printf("Alice\n");
}
else {
printf("Bob\n");
}
return 0;
}