50pts求调!!!
查看原帖
50pts求调!!!
1430250
_hud楼主2024/11/2 16:35

思路是要求的不就是一个连续区间使一个区间所有数的gcd为 1 的最小长度吗
那我们只要从区间长度入手,每次枚举出长度为 2,3,......,n 的连续区间,再来统计它们的 gcd 是否为 1,就可以保证我们第一次找出的答案即为最优
(第k长度的gcd = gcd(k-1长度的gcd,a[i+k]))
(用 rec 滚动数组来记录上一长度的gcd)

#include <bits/stdc++.h>
#define __init ios::sync_with_stdio(false);cin.tie(0), cout.tie(0)

using namespace std;

const int MAXN = 1e5;
int n, a[MAXN], rec[MAXN][2]; // rec 滚动数组 

signed main() {
	__init;
	cin >> n;
	int cnt = 0;
	bool flag = 1;
	for(int i = 0;i < n;i++) {
		cin >> a[i];
		cnt += (a[i] == 1);	
	}
	if(cnt) {
		cout << n-cnt;
		return 0;
	}
	for(int i = 0;i < n-1;i++) {
		rec[0][i] = __gcd(a[i], a[i+1]);
		if(rec[0][i] == 1) {
			cout << n;
			return 0;
		}
	}
	for(int w = 2;w < n;w++) {
		for(int i = 0;i < n-w;i++) {
			rec[flag][i] = __gcd(rec[(flag ? 0 : 1)][i], a[i+w]);
			if(rec[flag][i] == 1) {
				cout << n-1+w;
				return 0;
			}
		}
		flag = (flag ? 0 : 1);
	}
	cout << -1;
	return 0;
}
2024/11/2 16:35
加载中...