【悬赏关注】求助分析时间复杂度
查看原帖
【悬赏关注】求助分析时间复杂度
578619
Azur_Lane楼主2023/7/24 19:11

如果无脑分析,应该是 O(nlog⁡nlog⁡2V)\text{O}(n\log n\log^2V)。

但是 gcd⁡\gcd 这一块的复杂度一直是一个问题。

看了楼上神犇的 帖子 以后我觉得不太确定,所以请问一下讨论区有没有大佬帮忙看一下到底是多少。

//洛谷 P5502
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int f[N][20], lg[N];
int FGCD(int L, int R) {
    int k = lg[R - L + 1];
    return __gcd(f[L][k], f[R - (1 << k) + 1][k]);
}
signed main() {
    int n, ans = 0;
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) scanf("%lld", f[i]);
    for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
    for (int j = 1; j <= lg[n]; j++)
        for (int i = 1; i + (1 << j) - 1 <= n; i++)
            f[i][j] = __gcd(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
    for (int i = 1; i <= n; i++) {
        for (int j = i, p; j <= n; j = p + 1) {
            int l = j, r = n, cur = FGCD(i, j);
            while (l + 1 < r) {
                int mid = (l + r) >> 1;
                if (FGCD(i, mid) == cur)
                    l = mid;
                else
                    r = mid;
            }
            p = (FGCD(i, r) == cur ? r : l);
            ans = max(ans, cur * (p - i + 1));
        }
    }
    printf("%lld", ans);
    return 0;
}
2023/7/24 19:11
加载中...