codeforces 347C Alice and Bob(数学,思维)

题意:
一个集合,里面有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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45755679/article/details/108033642