[CF798C] Mike and gcd problem

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
0"<<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
"<<ans;
    }
}
原文地址:https://www.cnblogs.com/mollnn/p/12804923.html