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

来源:互联网 发布:德军步兵班 知乎 编辑:程序博客网 时间:2024/06/05 15:41
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
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.


题意:给出A序列,ai,ai+1>aiai+1ai+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;}


1 0