[CF798C] Mike and gcd problem - GCD,思维

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;
    }
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12804923.html
gcd
今日推荐