Codeforces Round #410 (Div. 2) C

Description

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 + 1and 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
2
1 1
output
YES
1
input
3
6 2 4
output
YES
0
input
2
1 3
output
YES
1
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.

题意:要使得,我们可以这样修改 ai - ai + 1, ai+ ai + 1,问最少修改次数

解法:按照上面操作把所有的数字变成偶数就行了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=654321;
 5 int x[maxn];
 6 int n;
 7 int num;
 8 int sum;
 9 int main()
10 {
11     cin>>n;
12     cin>>x[1];
13     num=x[1];
14     for(int i=2; i<=n; i++)
15     {
16         cin>>x[i];
17         num=__gcd(x[i],num);
18     }
19    // cout<<num<<endl;
20     if(num>1)
21     {
22         cout<<"YES
0
";
23         return 0;
24     }
25     for(int i=1; i<n; i++)
26     {
27         while(x[i]%2)
28         {
29             int pos=x[i];
30             x[i]-=x[i+1];
31             x[i+1]+=pos;
32             sum++;
33         }
34     }
35    // cout<<x[n]<<endl;
36     while(x[n]%2)
37     {
38         int pos=x[n-1];
39         x[n-1]-=x[n];
40         x[n]+=pos;
41         sum++;
42     }
43     cout<<"YES
";
44     cout<<sum<<endl;
45     return 0;
46 }
原文地址:https://www.cnblogs.com/yinghualuowu/p/6750366.html