【CodeForces

来源:互联网 发布:手机电影网php源码 编辑:程序博客网 时间:2024/05/29 12:16

E - Mike and gcd problem


 

Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the sequence B = [b1, b2, ..., bn] beautiful if the gcd of all its elements is bigger than 1, i.e. .

Mike wants to change his sequence in order to make it beautiful. In one move he can choose an index i (1 ≤ i < n), delete numbers ai, ai + 1 and put numbers ai - ai + 1, ai + ai + 1 in their place instead, in this order. He wants perform as few operations as possible. Find the minimal number of operations to make sequence A beautiful if it's possible, or tell him that it is impossible to do so.

 is the biggest non-negative number d such that d divides bi for every i (1 ≤ i ≤ n).

Input

The first line contains a single integer n (2 ≤ n ≤ 100 000) — length of sequence A.

The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109) — elements of sequence A.

Output

Output on the first line "YES" (without quotes) if it is possible to make sequence Abeautiful by performing operations described above, and "NO" (without quotes) otherwise.

If the answer was "YES", output the minimal number of moves needed to make sequenceA beautiful.

Example
Input
21 1
Output
YES1
Input
36 2 4
Output
YES0
Input
21 3
Output
YES1
Note

In the first example you can simply make one move to obtain sequence [0, 2] with .

In the second example the gcd of the sequence is already greater than 1.


题意:给定一个序列,现在要使这个序列变得beautiful,条件是序列中所有数的gcd(最大公约数)>1。我们可以进行的操作是使得序列中的a[i]和a[i+1]变为a[i]-a[i+1]和a[i]+a[i+1],问是否能使序列变得beautiful,如果可以,需要多少次操作。


分析:首先可以肯定的是一定能变得beautiful。通过数据我们可以发现,如果序列的初始gcd>1,那么操作次数为0,否则,最后的序列中的元素一定全为偶数。那么我们只需要把序列中的奇数变为偶数就行了,当奇数和奇数相邻使变为偶数只需要一次操作,当奇数与偶数相邻时需要两次操作,计算个数即可。


代码如下:

#include <map>#include <cmath>#include <queue>#include <stack>#include <vector>#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>#define LL long longusing namespace std;const int MX = 1e5 + 5;const int mod = 1e9 + 7;const int INF = 2e9 + 5;int a[MX];int gcd(int a, int b){    return b == 0 ? a : gcd(b, a%b);}int main(){    int n;    scanf("%d", &n);    for(int i = 0; i < n; i++){        scanf("%d", &a[i]);    }    int d = gcd(a[0], a[1]);    for(int i = 2; i < n; i++){        d = gcd(d, a[i]);    }    int cnt = 0;    if(d > 1){        printf("YES\n0\n");        return 0;    }    else{        for(int i = 0; i < n-1; i++){            if(a[i] & 1){                if(a[i+1] & 1){                    cnt++;                    a[i] = a[i+1] = 2;                }                else{                    cnt += 2;                    a[i] = a[i+1] = 2;                }            }        }        if(a[n-1] & 1)  cnt += 2;    }    printf("YES\n%d\n", cnt);    return 0;}


原创粉丝点击