您的位置:首页 > 其它

CodeForces 346A--博弈

2016-07-22 21:59 239 查看
题意:

两个人从集合中取数,任意取出两个不同的数,集合中不能包含取出数的 |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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: