题解:
1.当gcd(a[1],a[2]…a[n]) > 1 ans = YES,0;
2.否则,可知经过两次变换, (a[i],a[i+1]) -> (a[i]-a[i+1],a[i]+a[i+1]) ->(-a[i+1]2,a[i]2) 有公共除数2,再仔细分析,当相邻为两个奇数时,一次变换即可变为偶数,当为一奇一偶时,需要两次变换。所以先贪心**前面那种情况,然后再处理后面那种情况。
,AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
int n;
int a[maxn];
LL gcd(LL a, LL b)
{
return b == 0? a:gcd(b,a%b);
}
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
int ans = a[0];
for(int i = 1; i < n && ans != 1; i++)
ans = gcd(abs(ans),abs(a[i]));
if(ans > 1) {printf("YES\n0\n");return 0;}
ans = 0;
for(int i = 0; i < n; i++)
if((i+1) < n && (a[i]&1) && (a[i+1]&1)) {ans ++;a[i] = a[i+1]= 2;}
for(int i = 0; i < n; i++)
if(a[i]&1) ans += 2;
printf("YES\n%d\n",ans);
return 0;
}