题解 P8792 [蓝桥杯 2022 国 A] 最大公约数
Aiopr_2378 · · 题解
题目大意
给定
解题思路
考虑只有互质的多个数在一起时,他们的
所以我们考虑最少多少个相邻的数取
进一步考虑优化:
我们发现,若存在
另外,为了更快的求出区间的 因为作者比较懒,使用了稀疏表的方法解决(主要是码量小)。
注意常数优化/kk
参考代码
#include<iostream>
using namespace std;
#define MAXN 100005
int n,lg[MAXN],f[30][MAXN];
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
int query(int l,int r){
int tmp=lg[r-l+1];
return gcd(f[tmp][l],f[tmp][r-(1<<tmp)+1]);
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>f[0][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<=n;i++){
f[j][i]=gcd(f[j-1][i],f[j-1][i+(1<<(j-1))]);
}
}
if(query(1,n)>1) return puts("-1"),0;
int l=1,r=1,ans=0x3f3f3f3f;
for(;r<=n;r++){
while(l<r&&query(l+1,r)==1) l++;
if(query(l,r)==1) ans=min(ans,r-l);
}
cout<<n+ans-1;
return 0;
}