题意:
一个集合,里面有n个数,并且都不相等,两个人依次从集合里面挑选两个不同的数 x,y ,使得|x-y|不在集合中,并将|x-y|加入到集合中,直到某个人不能再操作为止。
题解:
这道题其实跟策略没有关系,只跟还能放多少的数有关,我一开始觉得 1~最大值之间的所有数都可以被放进集合里面,所以答案为max-n,但是wa了,后来才发现 2,4 ,6,8这组数据就不行,仔细一想,可以发现,假设集合里面的元素是 a, 2a, 3a, 4a, 5a,…,ka,那么我们是无法再添加任何数的,并且最多只有k个数,在看,这些数的最大公约数其实就是a,那么k=max/gcd,即集合里面最大可以容纳的个数,那么k-n就是我们还能够放进去的数的个数,如果为奇数,那么第一个人赢,反之第二个人赢。
虽然看起来简单,但思路确实比较难想。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int MAXN=1e3+5;
int a[MAXN];
int gcd(int a,int b)
{
if (b == 0)
return a;
else if (a < b)
return gcd(b, a);
else
return gcd(b, a % b);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
int gg=gcd(a[1],a[2]);
for(int i=3;i<=n;i++)
{
gg=gcd(gg,a[i]);
}
if((a[n]/gg-n)&1)
{
cout<<"Alice"<<endl;
}
else
{
cout<<"Bob"<<endl;
}
}