• Codeforces Round #410 (Div. 2) C


    Description

    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 + 1and 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.

    题意:要使得,我们可以这样修改 ai - ai + 1, ai+ ai + 1,问最少修改次数

    解法:按照上面操作把所有的数字变成偶数就行了

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 const int maxn=654321;
     5 int x[maxn];
     6 int n;
     7 int num;
     8 int sum;
     9 int main()
    10 {
    11     cin>>n;
    12     cin>>x[1];
    13     num=x[1];
    14     for(int i=2; i<=n; i++)
    15     {
    16         cin>>x[i];
    17         num=__gcd(x[i],num);
    18     }
    19    // cout<<num<<endl;
    20     if(num>1)
    21     {
    22         cout<<"YES
    0
    ";
    23         return 0;
    24     }
    25     for(int i=1; i<n; i++)
    26     {
    27         while(x[i]%2)
    28         {
    29             int pos=x[i];
    30             x[i]-=x[i+1];
    31             x[i+1]+=pos;
    32             sum++;
    33         }
    34     }
    35    // cout<<x[n]<<endl;
    36     while(x[n]%2)
    37     {
    38         int pos=x[n-1];
    39         x[n-1]-=x[n];
    40         x[n]+=pos;
    41         sum++;
    42     }
    43     cout<<"YES
    ";
    44     cout<<sum<<endl;
    45     return 0;
    46 }
  • 相关阅读:
    Linux日志文件utmp、wtmp、lastlog、messages
    Linux日志五大命令详解
    php 函数合并 array_merge 与 + 的区别
    MySQL对数据表进行分组查询(GROUP BY)
    如何在mysql中查询每个分组的前几名
    Autojump:一个可以在 Linux 文件系统快速导航的高级 cd 命令
    linux 查看磁盘空间大小
    js刷新页面方法大全
    [知乎有感] 读研到底为了什么,值不值得?
    [Hadoop] 在Ubuntu系统上一步步搭建Hadoop(单机模式)
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/6750366.html
Copyright © 2020-2023  润新知