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

54 篇文章 0 订阅
37 篇文章 0 订阅
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>aiai+1ai+ai+1 ai,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;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值