您的位置:首页 > 其它

codeforce 798C Mike and gcd problem (简单数学)

2017-04-22 12:37 357 查看
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


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.

题意:给出A序列,ai,ai+1−>ai−ai+1,ai+ai+1ai,ai+1−>ai−ai+1,ai+ai+1称为一次操作
询问使得序列gcd>1的最少操作次数,不能输出-1

思路: 举个例子, 两个互质并且一奇数一偶数 a, b -> a-b, a+b -> -2b, 2a ->最小公倍数就是2了,所以最后肯定可以变成为gcd = 2的序列, 显然两个奇数就操作一次就都变成偶数了,一奇数一偶数就要两次了;

trick: 之前要扫一遍,判断是不是已经gcd > 1了, 比赛中我过了pp之后,试了一发9 6 炸掉了。。。然后又去改,这题就只有600+分了,,,真是蒟蒻啊。。

另外,如果ai可以为0,n可以为1,全为0, 0 奇数 0都是输出no的

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
ll a[maxn];
int main()
{
int n;
ll sum = 0;
cin >> n;
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]), sum += a[i];
ll temp = a[1];
for(int i = 2; i <= n; i++)
{
temp = __gcd(a[i], temp);
}
if(temp > 1)
{
cout << "YES" << endl;
cout << 0 << endl;
return 0;
}
if(sum == 0)
{
cout << "NO" << endl;
return 0;
}
for(int i = 2; i <= n; i++)
{
if(a[i]%2 && a[i-1] == 0 && a[i+1] == 0)
{
cout << "NO" << endl;
return 0;
}
}
ll ans = 0;
a[n+1] = 0;
for(int i = 1; i <= n; i++)
{
if(a[i]%2 && a[i+1]%2)
{
ans++;
i++;
}
else if(a[i]%2 && a[i+1]%2 == 0)
{
if(i == n)
{
ans += 2;
}
else
{
ans += 2;
i++;
}
}
}
cout << "YES" << endl;
cout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: