Description
Mike 给定一个 \(n\) 个元素的整数序列 \(A=[a_1,a_2,...,a_n]\),每次操作可以选择一个 \(i (1 \le i<n)\),将 \(a[i],a[i+1]\) 变成 \(a[i]-a[i+1]\) 和 \(a[i]+a[i+1]\)。现在想要的是 \(A\) 序列所有元素的最大公约数大于 \(1\),请计算最少的操作次数。
Solution
原始序列的 GCD 为 1 时,我们只需要将其变为 2
考虑两个数如何变成全偶数:两个奇数需要 \(1\) 次操作,一个奇数一个偶数需要 \(2\) 次操作
于是我们把原序列提出奇偶性后,先扫一遍处理掉所有相邻的奇数,再扫一遍处理掉所有一个奇数一个偶数的情况即可
无解是不会无解的
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n,a[N],g,ans;
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) g=__gcd(a[i],g);
if(g>1) {
cout<<"YES\n0"<<endl;
}
else {
for(int i=1;i<=n;i++) a[i]%=2;
for(int i=1;i<n;i++) if(a[i]&a[i+1]) a[i]=a[i+1]=0, ++ans;
for(int i=1;i<n;i++) if(a[i]^a[i+1]) a[i]=a[i+1]=0, ans+=2;
cout<<"YES\n"<<ans;
}
}