Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)相关的知识,希望对你有一定的参考价值。

传送门

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

Sample Input

2
1 1

2
1 3

3
6 2 4

Sample Output

YES
1
YES
1
YES
0

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.

思路

题解:

= =想了很久,虽然快接近思路,但是。。就差那么一点啊。。哎。。

First of all, the answer is always YES.

If 技术分享 then the answer is 0.

Now suppose that the gcd of the sequence is 1. After we perform one operation on ai and ai + 1, the new gcd d must satisfy d|ai - ai + 1and d|ai + ai + 1 技术分享 d|2ai and d|2ai + 1. Similarly, because d is the gcd of the new sequence, it must satisfy d|aj, j ≠ i, i + 1.

Using the above observations we can conclude that 技术分享, so the gcd of the sequence can become at most 2 times bigger after an operation. This means that in order to make the gcd of the sequence bigger than 1 we need to make all numbers even. Now the problem is reduced to the following problem:

Given a sequence v1, v2, ... , vn of zero or one,in one move we can change numbers vi, vi + 1 with 2 numbers equal to 技术分享. Find the minimal number of moves to make the whole sequence equal to 0.

It can be proved that it is optimal to solve the task for consecutive ones independently so we divide the array into the minimal number of subarrays full of ones, if their lengths are s1, s2, ... , st,the answer is 技术分享.

Complexity is 技术分享.

 

#include<bits/stdc++.h>
using namespace std;

int gcd(int a,int b)
{
	return b?gcd(b,a%b):a;
}

int main()
{
	int n,res = 0,resgcd = 0,cnt = 0,tmp;
	scanf("%d",&n);
	while (n--)
	{
		scanf("%d",&tmp);
		resgcd = gcd(resgcd,tmp);
		if (tmp&1)	cnt++;
		else	res += (cnt/2) + 2*(cnt&1),cnt = 0;
	}
	res += (cnt/2) +2*(cnt&1);
	printf("YES\n");
	if (resgcd > 1)	printf("0\n");
	else	printf("%d\n",res);
	return 0;
}

  

以上是关于Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #410 (Div. 2) 解题报告

Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)

Codeforces Round #410 (Div. 2)-A - Mike and palindrome

[卿学姐带飞系列]-Codeforces Round #410 (Div. 2)_B - Mike and strings

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)