#include<bits/stdc++.h>
using namespace std;
#define int long long
void Build(vector<vector<int>> &ST)
{
int n = ST.size(), m = ST[0].size();
for (int e = 1; e < m; e++)
for (int i = 0; i + (1 << e) - 1 < n; i++)
ST[i][e] = __gcd(ST[i][e - 1], ST[i + (1 << (e - 1))][e - 1]);
}
int search(vector<vector<int>> &ST, int l, int r)
{
int e = floor(log2(r - l + 1));
return __gcd(ST[l][e], ST[r - (1 << e) + 1][e]);
}
signed main()
{
int T;
cin >> T;
while (T--)
{
int n, dig;
cin >> n;
if (n == 1)
{
cout << 1 << endl;
cin >> dig;
continue;
}
vector<int> a(n), b(n - 1);
for (int i = 0; i < n; i++)
{
cin >> a[i];
if (i > 0)
b[i - 1] = abs(a[i] - a[i - 1]);
}
n--;
int m = ceil(log2(n)) + 1;
vector<vector<int>> ST(n, vector<int>(m, 0));
for (int i = 0; i < n; i++)
ST[i][0] = b[i];
Build(ST);
int l, r, ans = 0, gcd;
for (l = 0, r = 0; r < n; r++)
{
gcd = search(ST, l, r);
if (gcd > 1)
ans = max(ans, r - l + 1);
else
{
while (l < r && search(ST, l, r) == 1)
l++;
gcd = search(ST, l, r);
if (gcd > 1)
ans = max(ans, r - l + 1);
}
}
cout << ans + 1 << endl;
}
}
Codeforces 1549D - Integers Have Friends 讲解 (稀疏表(ST表)、滑动窗口、gcd)
于 2024-07-08 18:49:00 首次发布