【CodeForces - 798C Mike and gcd problem】 思维+贪心

6 篇文章 0 订阅
5 篇文章 0 订阅

E - Mike and gcd problem


 

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 Abeautiful by performing operations described above, and "NO" (without quotes) otherwise.

If the answer was "YES", output the minimal number of moves needed to make sequenceA beautiful.

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


题意:给定一个序列,现在要使这个序列变得beautiful,条件是序列中所有数的gcd(最大公约数)>1。我们可以进行的操作是使得序列中的a[i]和a[i+1]变为a[i]-a[i+1]和a[i]+a[i+1],问是否能使序列变得beautiful,如果可以,需要多少次操作。


分析:首先可以肯定的是一定能变得beautiful。通过数据我们可以发现,如果序列的初始gcd>1,那么操作次数为0,否则,最后的序列中的元素一定全为偶数。那么我们只需要把序列中的奇数变为偶数就行了,当奇数和奇数相邻使变为偶数只需要一次操作,当奇数与偶数相邻时需要两次操作,计算个数即可。


代码如下:

#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long

using namespace std;
const int MX = 1e5 + 5;
const int mod = 1e9 + 7;
const int INF = 2e9 + 5;

int a[MX];

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

int main(){
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++){
        scanf("%d", &a[i]);
    }
    int d = gcd(a[0], a[1]);
    for(int i = 2; i < n; i++){
        d = gcd(d, a[i]);
    }
    int cnt = 0;
    if(d > 1){
        printf("YES\n0\n");
        return 0;
    }
    else{
        for(int i = 0; i < n-1; i++){
            if(a[i] & 1){
                if(a[i+1] & 1){
                    cnt++;
                    a[i] = a[i+1] = 2;
                }
                else{
                    cnt += 2;
                    a[i] = a[i+1] = 2;
                }
            }
        }
        if(a[n-1] & 1)  cnt += 2;
    }
    printf("YES\n%d\n", cnt);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值