zoukankan      html  css  js  c++  java
  • [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;
        }
    }
    
  • 相关阅读:
    javaSE笔记-多态
    javaSE笔记-接口
    javaSE笔记-static关键字
    javaSE笔记-fianl关键字
    javaSE笔记-抽象类
    javaSE笔记-继承
    javaSE笔记-JKD、JRE、JVM各自的作用和关系
    搭建网络验证RIP协议
    计算机网络学习
    python itertools 模块讲解
  • 原文地址:https://www.cnblogs.com/mollnn/p/12804923.html
Copyright © 2011-2022 走看看