您的位置:首页 > 其它

789C Mike and gcd problem

2017-04-24 13:47 281 查看
C. 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

2

1 1

Output

YES

1

Input

3

6 2 4

Output

YES

0

Input

2

1 3

Output

YES

1

对于任意两个相邻的数进行操作的最终结果都会使他们都变为偶数,因此如果需要进行操作的话,最终目的都是使所有数都变为偶数。

如果相邻两个数位一奇一偶需要操作两次,两奇则需要操作一次这样的话只要On模拟一遍就能得出答案。如果一开始就符合条件直接输出0即可。

因此这一题没有NO的情况。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm = 100005;
int a[maxm], b[maxm];
int gcd(int x, int y);
int main()
{
int n, i, j, k, sum, ans;
scanf("%d", &n);
for (i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b + 1, b + 1 + n);
if (b
== 0)
ans = 5;
else
{
ans = b
;
for (i = n - 1;i >= 1;i--)
{
if (b[i] == 0)
continue;
ans = gcd(ans, b[i]);
}
}
if (ans > 1)
{
printf("YES\n0\n");
return 0;
}
ans = 0;
for (i = 1;i < n;i++)
{
if (a[i] % 2 == 0)
continue;
if (a[i + 1] % 2 != 0)
{
ans++;
a[i + 1] = 2;
}
else
{
ans += 2;
a[i + 1] = 2;
}
}
if (a
% 2 != 0)
ans += 2;
printf("YES\n%d\n", ans);
return 0;
}
int gcd(int x, int y)
{
if (x == 0)
return y;
return gcd(y%x, x);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: