codeforces 798C

来源:互联网 发布:java程序员太多了知乎 编辑:程序博客网 时间:2024/06/06 16:48

题意:如果一个序列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|(ab) && 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);}}