1 条题解

  • 0
    @ 2025-10-2 15:37:19

    额外可以顺手完成的题目:https://www.luogu.com.cn/problem/P1890

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN = 1000000;
    int n;
    int h[MAXN + 5];
    // st[i][j] 存从 h[i] 开始 2^j 个元素的 gcd
    int st[MAXN + 5][25];
    int gcdAll(int l, int r)
    {
        int j = log2(r - l + 1);
        return __gcd(st[l][j], st[r - (1 << j) + 1][j]);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> h[i];
    
        for (int i = 1; i <= n; i++)
            st[i][0] = h[i];
        for (int j = 1; j <= 20; j++)
            for (int i = 1; i + (1 << j) - 1 <= n; i++)
                st[i][j] = __gcd(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
    
        for (int i = 1; i <= n; i++)
        {
            int l = 1;
            int r = i;
            int maxL = i;
            while (l <= r)
            {
                int mid = (l + r) / 2;
                if (gcdAll(mid, i) == h[i])
                {
                    maxL = mid;
                    r = mid - 1;
                }
                else
                    l = mid + 1;
            }
            l = i;
            r = n;
            int maxR = i;
            while (l <= r)
            {
                int mid = (l + r) / 2;
                if (gcdAll(i, mid) == h[i])
                {
                    maxR = mid;
                    l = mid + 1;
                }
                else
                    r = mid - 1;
            }
            cout << maxR - maxL + 1 << " ";
        }
        return 0;
    }
    
    • 1

    信息

    ID
    109
    时间
    2000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    46
    已通过
    9
    上传者