题目链接:​​传送门​​​
题意:给个n长度的等差数列,A开始,A,B两人轮流每次从这里面选任意两个数x和y,然后判断序列有没有|x-y|,如果没有就把|x-y|加进序列,如果没有就说明这个人没的选了,算输。输出胜利的一方。
写几个数据把所有的情况求出来,最后序列的一定是若干个小于Max(序列最大)的数。
并且每个数都是原序列所有数的gcd值的倍数,所以最后的数量变成了(Max/gcd-n)
如果这个值是偶数就说明A最后没得选了
代码如下:

`#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int gcd(int a, int b) {
return (b==0)?a:gcd(b,a%b);
}
#define N 110
int a[N];
int main()
{
int i,j,n,m;
while(scanf("%d",&n)!=EOF){
int Max=0;
for(i=1;i<=n;i++)
cin>>a[i];
sort(a,a+1+n);
int res=a[n];
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++){
res=gcd(res,gcd(a[i],a[j]));
}
int x=(a[n]/res)-n;
if(x%2==0) cout<<"Bob"<<endl;
else cout<<"Alice"<<endl;
}
return 0;
}
`