题目链接:[CodeForces 346A]Alice and Bob[数学]
题意分析:
Alice 和 Bob又来玩游戏了,这次游戏规则是从给出的数列中取出两个数,把他们差的绝对值增加到原数列中,如果差的绝对值已经出现在原数列中,则这次操作是无效的,最终无法操作的人失败。
解题思路:
因为放入的是差的绝对值,所以最终数列中的数肯定都比最大的那个数小。那么要添加多少次数字呢?也就是总共能进行几次操作。
- 首先任意两个数x、y,和他们生成的数,不断地进行操作,肯定能得到一个等差数列,此时这个等差数列无法再进行操作,公差为 gcd(x,y) 。假设 x>y ,那么第一次操作产生 x−y 放入数列,第二次可以有 y−(x−y)=2y−x ,不断操作最终 gcd(x,y)=ax+by ,其实就是辗转相减求最大公约数。
- 既然有了上一个条件,那么将数列中所有的数任意两个这么搞下去,最终能形成一个等差数列。公差 d=所有元素的最大公约数 。
- 所以最终要加入:元素最大值/gcd - n 个元素。判断奇偶性即可。
个人感受:
除了想到该计算要放入多少个数,其它都没想法 = =。Orz
具体代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, x, t, gcd;
cin >> n >> gcd;
int mx = gcd;
for (int i = 1; i < n; ++i)
{
cin >> t;
gcd = __gcd(gcd, t);
mx = max(mx, t);
}
x = mx / gcd - n;
cout << (x % 2 ? "Alice" : "Bob") << '\n';
return 0;
}