题目链接:Codeforces-798C-Mike and gcd problem
因为
d|a
&&
d|b
->
d|(ax+by)
d|(a−b)
&&
d|(a+b)
->
d|2a
&&
d|2b
所以要将
gcd(ai)=1
转化成
gcd(ai)=2
。
将奇奇变成偶偶需要一次操作,将奇偶或偶奇变成偶偶需要两次操作。所以先处理奇奇,然后再处理其他情况。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int gcd(int a,int b)
{
return a%b?gcd(b,a%b):b;
}
int a[100007];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int k=gcd(a[1],a[2]);
for(int i=3;i<=n;i++) k=gcd(k,a[i]);
puts("YES");
if(k>1)
{
puts("0");
return 0;
}
int ans=0;
for(int i=1;i<=n;i++) if(a[i]&1) a[i]=1; else a[i]=2;
for(int i=2;i<=n;i++)
if(a[i]%2&&a[i-1]%2)
{
++ans;
a[i]=a[i-1]=2;
}
for(int i=2;i<=n;i++)
if((a[i]%2)^(a[i-1]%2))
{
ans+=2;
a[i]=a[i-1]=2;
}
printf("%d\n",ans);
return 0;
}