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

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.

解题思路:

题意为:输入给定数字,求他们的大于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;
}
时间: 2024-10-24 19:28:15

codeforces 798C Mike and gcd problem的相关文章

codeforces 798C.Mike and gcd problem 解题报告

题目意思:给出一个n个数序列:a1,a2,...,an (n的范围[2,100000],ax的范围[1,1e9] 然后想构造一个beautiful的序列 b1,b2, ..., bn,使得最大公约数 gcd(b1,b2,...,bn) > 1.任意ai,ai+1 可以用 ai-ai+1, ai+ai+1 来替换. 问序列 a 构造成 b 的最小操作次数 首先,这个题目是肯定有解的,也就是恒输出yes 试想一下,相邻两个数之间无非就是四种情况: (1)对于同偶情况,不需要做转换,公约数直接为2:

【算法系列学习】codeforces C. Mike and gcd problem

C. Mike and gcd problem http://www.cnblogs.com/BBBob/p/6746721.html 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 8 using namespace std; 9 const

798C - Mike and gcd problem

题意 通过将一组序列中 ai与ai+1 变为 ai-ai+1 与ai+ai+1 的操作将这组序列的gcd变成不为1. 看了题解才会写== ,所以叫做补提嘛QWQ,当d|a && d|b 时 d|ax+by ,即 d|ai-ai+1 d|ai+ai+1 时,可得 d|2ai, d|2ai+1 从而新序列的gcd一定为2,所以先求出所有数字的gcd(因为我太菜的原因不知道算gcd的复杂度其实不高,log(max(a,b))这样,如果不等于1,直接输出0. 然后再贪心扫两遍就行. #includ

G - Mike and gcd problem

G - 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 be

CF Round410 C. Mike and gcd problem

C. Mike and gcd problem 一奇一偶需要两次操作,两个奇数需要一次操作. 798D - Mike and distribution In the beginning, it's quite easy to notice that the condition " 2·(ap1?+?...?+?apk) is greater than the sum of all elements in A " is equivalent to " ap1?+?...?+?a

Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)

传送门 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.

CodeForce-798C 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 c

CF798C Mike and gcd problem

思路: 首先如果数列的最大公约数大于1,直接输出即可. 否则,设对原数列中的ai和ai+1进行一次操作,分别变为ai - ai+1和ai + ai+1.设新数列的最大公约数为d,则由于d|(ai - ai+1)并且d|(ai + ai+1)得到d|(2ai)且d|(2ai+1).则d|gcd(a1, a2, ..., 2ai, 2ai+1, ai+2, ..., an)|2gcd(a1, a2, ..., an) = 2.说明进行一次这样的操作最多可以把最大公约数变为原来的2倍.所以我们的目标就

CodeForces 689E Mike and Geometry Problem

#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include&