[CodeForces 346A]Alice and Bob[数学]

这篇博客介绍了CodeForces 346A问题的解题过程,涉及Alice和Bob玩的一个数学游戏。游戏规则是选择数列中的两个数,计算它们差的绝对值并添加到数列中,若差值已存在则无效。解题关键在于理解数列最终会形成一个以最大公约数为公差的等差数列,因此通过计算最大值与数列长度的关系可以确定操作次数,从而决定胜负。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:[CodeForces 346A]Alice and Bob[数学]
题意分析:
Alice 和 Bob又来玩游戏了,这次游戏规则是从给出的数列中取出两个数,把他们差的绝对值增加到原数列中,如果差的绝对值已经出现在原数列中,则这次操作是无效的,最终无法操作的人失败。
解题思路:
因为放入的是差的绝对值,所以最终数列中的数肯定都比最大的那个数小。那么要添加多少次数字呢?也就是总共能进行几次操作。

  • 首先任意两个数x、y,和他们生成的数,不断地进行操作,肯定能得到一个等差数列,此时这个等差数列无法再进行操作,公差为 gcd(x,y) 。假设 x>y ,那么第一次操作产生 xy 放入数列,第二次可以有 y(xy)=2yx ,不断操作最终 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值