1 条题解

  • 0
    @ 2025-8-24 22:39:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 22:39:20,当前版本为作者最后更新于2022-08-07 17:17:40,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    文文的数学游戏

    解法

    为方便表述,下面令 M=gcdi=1nbiM=\gcd_{i=1}^n b_i

    对于第一问,MM 的最大值即 aia_i 中的最小值。因为 g=gcd(a,b)min(a,b)g=\gcd(a,b)\leq \min(a,b)。当 MM 大于 aia_i 中的最小值,则存在至少一个 ii 使得 biai<Mb_i \leq a_i<M,此时 gcd(M,ai)<M\gcd(M,a_i)<M。而当 MM 取到 aia_i 中的最小值 amina_{\min} 可以让 bib_i 全部取到 amina_{\min},这样就可以使得 MM 最大。

    有多少种取法?令 $b_i=a_{\min},2a_{\min},\dots,na_{\min}(b_i \leq a_i)$ 都是不会改变 MM 的。考虑 amina_{\min} 前面的系数最大值 did_i,则 di=aiamind_i=\lfloor \dfrac{a_i}{a_{\min}}\rfloor。由于可以对每个 bib_i,任取 bi=c×amin(c[1,di])b_i=c\times a_{\min}(c \in [1,d_i]),则取法的答案为 i=1ndi\prod \limits_{i=1}^n d_i。记得开 long long,以及边乘边取模。

    #include <iostream>
    using namespace std;
    int a[100050],n,mgcd=1<<30;
    const int mod=1e9+7;
    int main()
    {
        cin >> n;
        for (int i=1;i<=n;i++)
        {
            cin >> a[i];
            mgcd=min(mgcd,a[i]);
        }
        long long ans=1;
        for (int i=1;i<=n;i++)
            ans=(long long)ans*(a[i]/mgcd)%mod;
        cout << mgcd << " " << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    7798
    时间
    2000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者