1 条题解

  • 0
    @ 2024-3-16 18:51:56

    暴力做法:枚举aia_i,计算除它外的其他元素的最大公约数。时间复杂度为O(n2logn)O(n^2 \log n),超时。

    我们可以预处理出两个数组llrr

    • lil_i表示a1a_1~aia_i的最大公约数
    • rir_i表示aia_i~ana_n的最大公约数

    然后对于aia_i,只需要再求一遍gcd(li1,ri+1)\gcd(l_{i-1},r_{i+1})即可。需要特判a1a_1ana_n

    时间复杂度为O(n)O(n),可以通过。

    AC code:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll N=1e6+5;
    ll n,a[N],l[N],r[N];
    int main(){
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            if(i==1)
                l[i]=a[i];
            else
                l[i]=__gcd(a[i],l[i-1]); // c++自带的__gcd函数
        }
        for(ll i=n;i>=1;i--)
            if(i==n)
                r[i]=a[n];
            else
                r[i]=__gcd(a[i],r[i+1]);
        printf("%lld ",r[2]); // 除去a[1]外其他元素的最大公约数
        for(ll i=2;i<n;i++)
            printf("%lld ",__gcd(l[i-1],r[i+1]));
        printf("%lld",l[n-1]); // 除去a[n]外其他元素的最大公约数
        return 0;
    }
    
    • 1

    信息

    ID
    607
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    (无)
    递交数
    148
    已通过
    53
    上传者