1 条题解

  • 0
    @ 2025-7-21 15:28:43

    O(nlogai)O(nloga_i)

    为了在数组 aa 之后得到 bb ,每个 aia_i 应该是 bib_i 的因数。每个 1i<n1≤i<nxx 必须是 bi/gcd(bi,bi+1)b_i/gcd(b_i,b_{i+1}) 的倍数

    对每一对 (i,i+1)(i,i+1) 。分析以下几种情况:

    • 如果 bi=aixb_i=a_i⋅xbi+1=ai+1xb_{i+1}=a_{i+1}⋅x ,或者 bi=aib_i=a_ibi+1=ai+1b_{i+1}=a_{i+1} :在这两种情况下, xx 的值并不重要。因为 bib_i 最初就能整除 bi+1b_{i+1} ,这个数组是合法的。
    • 如果是 bi=aixb_i=a_i⋅xbi+1=ai+1b_{i+1}=a_{i+1} ,那么取所有 1i<n1≤i<nLCM 值应确保这种情况始终正确。
    • 如果是 bi=aib_i=a_ibi+1=ai+1xb_{i+1}=a_{i+1}⋅x ,那么 xx 的值越大越好,因为乘积 ai+1aia_{i+1}a_i 会减小。

    由于问题保证了 xx 的存在,因此取 LCM 并输出即可

    #include<bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    typedef pair<LL, LL> PII;
    
    #define x first
    #define y second
    
    const int N = 6e5 + 10, mod = 1e9 + 7;
    
    LL a[N];
    
    void solve()
    {
        int n;
        cin >> n;
        for(int i = 1; i <= n; i ++)
        {
            cin >> a[i];
        }
        
        int ans = 1;
        for(int i = 2; i <= n; i ++)
            if(a[i] % a[i - 1] != 0)
            {
                int g = gcd(a[i], a[i - 1]);
                ans = lcm(ans, a[i - 1] / g);
            }
            
        cout << ans << endl;
    }
    
    int main()
    {
        int t = 1;
        scanf("%d", &t);
        while(t --)
            solve();
    }
    
    • 1

    信息

    ID
    393
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    3
    上传者