即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

CF#798 C. Mike and gcd problem(思维)

编程语言 NEET_Champloo 18℃ 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 numbersai, 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 ,我们可以将相邻两元素 a [ i ] , a [ i + 1 ] 改为 a [ i ] – a [ i + 1 ] 和 a [ i ] + a [ i + 1 ] ,问至少多少次操作后能使 gcd ( A1 ~ An) 大于1,若无法完成,则输出 NO

思路:显然我们把所有奇数修改成偶数即可满足条件,每次修改时若  a [ i ] 和 a [ i + 1 ] 同为奇数则修改一次,若一奇一偶则修改两次




#include
using namespace std;
const int N = 100000 + 10;

int n;
int a[N],c[N];

int gcd(int n,int m)
{
    int t = 1;
    while(t)
    {
        t = n % m;
        n = m;
        m = t;
    }
    return n;
}

int main()
{
    while(scanf("%d", &n) == 1)
    {
        memset(c,0,sizeof(c));
        for(int i=0; i < n; i++)
        {
            scanf("%d",& a[i]);
        }
        int ans = 0,tmp = gcd(a[0], a[1]);
        for(int i = 0; i < n; i++)
        {
            tmp = gcd(tmp, a[i]);
            if(a[i] & 1 && !c[i])
            {
                if(a[i + 1] & 1) ans++;
                else ans += 2;
                c[i] = 1;
                c[i + 1] = 1;
            }
        }
        if(tmp != 1) printf("YES\n0\n");
        else printf("YES\n%d\n", ans);
    }
}



 

转载请注明:CodingBlog » CF#798 C. Mike and gcd problem(思维)

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情