CF798C Mike and gcd problem 题解
FReQuenter · · 题解
先从只有两个数的情况开始考虑(设为
那么我们开始思考对于整个数组的操作:既然四种操作都导向偶数,那么最终整个数组都会变为偶数(因为奇数和偶数互质),除非整个数组一开始都是奇数且
所以我们可以将相邻奇数两两配对,每两个花费一次操作把他们变成偶数。如果还剩下一个奇数,那么它单独花费两次操作和旁边的偶数一起变成偶数。不会存在旁边没有偶数的情况,因为如果原数列全是奇数,要么
#include<bits/stdc++.h>
#define gcd __gcd
#define MAXN 100005
using namespace std;
int n,ans,a[MAXN];
signed main(){
cin>>n;
int g=0;
for(int i=1;i<=n;i++){
cin>>a[i];
g=gcd(g,a[i]);
}
if(g==1){
int i=1,j=1;
while(i<=n){
j=i;
if(a[i]%2==0) i++;
while(j<=n&&a[j+1]%2) j++;
ans+=(j-i+1)/2;
if((j-i+1)%2) ans+=2;
i=j+1;
}
}
cout<<"YES\n";
cout<<ans;
}