zoukankan      html  css  js  c++  java
  • codeforces 798C Mike and gcd problem

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

    解题思路:

    题意为:输入给定数字,求他们的大于1的最大公约数,如果没有则进行操作

    对数字a,b进行操作: a,b  a-b,a+b  -2b,2a

    由上可知,不论两个数字为什么,最多操作两次就有公约数2

    那么有三种情况:1.都为偶数,不需要进行操作。2.一个为奇数一个为偶数,需要操作两次,3.都为奇数,只需操作一次;

    然后随便打下就行了

    实现代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    ll gcd(ll a,ll b)
    {
        return b==0?a:gcd(b,a%b);
    }
    
    int main()
    {
        ll m,a[100005],i,ans,num;
       cin>>m;
       num = 0;
       for(i=1;i<=m;i++)
        cin>>a[i];
       ans = gcd(abs(a[1]),abs(a[2]));
       for(i=3;i<=m;i++)
        ans = gcd(ans,abs(a[i]));
       if(ans>1)
        cout<<"YES"<<endl<<"0"<<endl;
       else
       {
           for(i=1;i<m;i++)
    
               if(a[i]%2&&a[i+1]%2)
               {
                   a[i]=0;a[i+1]=0;num++;
               }
            for(i=1;i<m;i++)
               if((a[i]%2==0&&a[i+1]%2)||(a[i]%2&&a[i+1]%2==0))
                {
                   a[i]=0;a[i+1]=0;num+=2;
                }
    
           cout<<"YES"<<endl<<num<<endl;
       }
       return 0;
    }
  • 相关阅读:
    Google字典API与语音库
    CentOS 6.0 安装字符界面/text 安装/文本安装
    W3C Strict 验证的几个注意事项
    前端开发必备的6个Firefox插件
    自制的一套Aptana配色方案
    Firebug Console 与命令行全集
    项目管理的“三边六拍”!
    不使用第三个变量,交换两变量的值 (总结篇)
    dba学习笔记
    三思涂抹oracle(笔记)
  • 原文地址:https://www.cnblogs.com/kls123/p/6814862.html
Copyright © 2011-2022 走看看