如果无脑分析,应该是 O(nlognlog2V)。
但是 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;
}