2 - H
litachloveyou · · 个人记录
容易想到,如果原数组有
若没有
也就是找到一段区间
找到这样的区间之后构造
所以题目等价于求
我们可以枚举每一个
区间
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
void solve()
{
int n;
cin >> n;
vector<vector<int>>a(n + 1, vector<int>(24));
int cnt = 0;
for (int i = 1; i <= n; i++)
{
cin >> a[i][0];
if (a[i][0] == 1)cnt++;
}
if (cnt)
{
cout << n - cnt << "\n";
return;
}
for (int j = 1; j <= 22; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
a[i][j] = gcd(a[i][j - 1], a[i + (1 << (j - 1))][j - 1]);
}
}
auto query = [&](int l, int r)->int
{
int k = log2(r - l + 1);
return gcd(a[l][k], a[r - (1 << k) + 1][k]);
};
ll res = 1e18;
for (int i = 1; i <= n; i++)
{
int l = i, r = n;
int ans = -1;
while (l <= r)
{
int mid = l + r >> 1;
if (query(i, mid) == 1)
{
r = mid - 1;
ans = mid;
}
else
{
l = mid + 1;
}
}
if (ans != -1)
{
res = min(res, 1LL * (ans - i) * 2 + n - (ans - i + 1));
}
}
if (res >= 1e17)res = -1;
cout << res << "\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
//cin >> t;
while (t--)solve();
return 0;
}