题目链接: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;
}