题意:如果一个序列B={b1,b2,b3,…,bn},其gcd(b1,b2,b3...bn)>1则称之为漂亮的。
现在给定一个长度为序列和一个操作,选定一个i(0<=i<n),分别用ai-ai+1,ai+ai+1代替原来的ai,ai+1。问最少操作几次,使得序列成为一个漂亮的序列(2<=n<=1e5)
思路:d|(a−b) && d|(a+b) -> d|2a && d|2b
所以要将 gcd(ai)=1 转化成 gcd(ai)=2 。
一对奇数操作一次,即可变为偶数,一奇一偶要两个次。相邻两个都是奇数时,那么优先选择这两个数操作。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int d=__gcd(a[0],a[1]);
int ans=0;
for(int i=0;i<n;i++)
{
d=__gcd(d,a[i]);
if((a[i]&1)&&(a[i+1]&1))
{
i++;
ans++;
continue;
}
if(a[i]&1)ans+=2;
}
if(d!=1)printf("YES\n0\n");
else printf("YES\n%d\n",ans);
}
}