题目链接:https://codeforces.com/contest/798/problem/C
题目大意:给你n个数,a1,a2,…an。要使得gcd(a1,a2,…an)>1,可以执行一次操作使ai,ai+1变为ai - a[i + 1], ai + a[i + 1]。求出使得gcd(a1,a2,…an)>1所需要的最小操作数。

思路:首先,要知道如果能够实现gcd(a1,a2,…an)>1,那么a1~an肯定都是偶数(0也是偶数),所以我们的目的就是用最少的操作次数把所有数变成偶数。如果两个数都是奇数,那需要操作一次(奇数加减变成偶数),如果是偶数和奇数,那需要操作两次(奇数和偶数加减得到奇数,奇数再和奇数加减得到偶数),所以不存在gcd不能大于1的情况

#include <bits/stdc++.h>
#define LL long long
using namespace std;
 
int a[100005];
int main()
{
    int n, gcd;
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
        if(i==1){
            gcd=a[i];
        }
        else{
            gcd=__gcd(gcd, a[i]);
        }
    }
    printf("YES\n");
    if(gcd>1){
        printf("0\n");
        return 0;
    }
    int ans=0;
    a[n+1]=2;
    for(int i=1; i<=n; i++){
 
        if(a[i]%2==1&&a[i+1]%2==1){
            ans++;
            i++;
        }
        else if(a[i]%2==1&&a[i+1]%2==0){
            ans+=2;
        }
    }
    printf("%d\n", ans);
 
    return 0;
}