cf 798c Mike and gcd problem

来源:互联网 发布:兰州大学网络教育入口 编辑:程序博客网 时间:2024/06/05 15:54

. Mike and gcd problem
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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 A beautiful by performing operations described above, and "NO" (without quotes) otherwise.

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

Examples
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.




#include<iostream>#include<cstdio>#include<string.h>#include<math.h>#include<string>#include<map>#include<set>#include<vector>#include<algorithm>#include<queue>using namespace std;const int INF = 0x3f3f3f3f;const int NINF = 0xc0c0c0c0;int gcd(int a,int b){    if(b) while((a%=b) && (b%=a));    return a+b;}int main(){    int n;    int num[100005];    memset(num,0,sizeof(num));    cin >> n;    for(int i=0;i<n;i++){        cin  >> num[i];    }    int temp;    for(int i=0;i<n;i++){        if(i==0){            temp = gcd(num[i],num[i+1]);        }        else{            temp = gcd(temp,num[i]);        }    }    if(temp > 1){        cout << "YES" << endl;        cout << 0 << endl;    }    else{        int cnt = 0;        for(int i=0;i<n-1;i++){            if(num[i]&1==0 && num[i+1]&1==0) continue;            if(num[i]&1 && num[i+1]&1){                num[i+1] = num[i]+num[i+1];                cnt++;                continue;            }            else if(num[i]&1){                num[i+1] = 2;                cnt += 2;                continue;            }        }        if(num[n-1]&1) cnt+=2;        cout << "YES" << endl;        cout << cnt << endl;    }}



0 0
原创粉丝点击