【CodeForces
来源:互联网 发布:手机电影网php源码 编辑:程序博客网 时间:2024/05/29 12:16
E - 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).
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 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.
21 1
YES1
36 2 4
YES0
21 3
YES1
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.
题意:给定一个序列,现在要使这个序列变得beautiful,条件是序列中所有数的gcd(最大公约数)>1。我们可以进行的操作是使得序列中的a[i]和a[i+1]变为a[i]-a[i+1]和a[i]+a[i+1],问是否能使序列变得beautiful,如果可以,需要多少次操作。
分析:首先可以肯定的是一定能变得beautiful。通过数据我们可以发现,如果序列的初始gcd>1,那么操作次数为0,否则,最后的序列中的元素一定全为偶数。那么我们只需要把序列中的奇数变为偶数就行了,当奇数和奇数相邻使变为偶数只需要一次操作,当奇数与偶数相邻时需要两次操作,计算个数即可。
代码如下:
#include <map>#include <cmath>#include <queue>#include <stack>#include <vector>#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>#define LL long longusing namespace std;const int MX = 1e5 + 5;const int mod = 1e9 + 7;const int INF = 2e9 + 5;int a[MX];int gcd(int a, int b){ return b == 0 ? a : gcd(b, a%b);}int main(){ int n; scanf("%d", &n); for(int i = 0; i < n; i++){ scanf("%d", &a[i]); } int d = gcd(a[0], a[1]); for(int i = 2; i < n; i++){ d = gcd(d, a[i]); } int cnt = 0; if(d > 1){ printf("YES\n0\n"); return 0; } else{ for(int i = 0; i < n-1; i++){ if(a[i] & 1){ if(a[i+1] & 1){ cnt++; a[i] = a[i+1] = 2; } else{ cnt += 2; a[i] = a[i+1] = 2; } } } if(a[n-1] & 1) cnt += 2; } printf("YES\n%d\n", cnt); return 0;}
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- 颠覆平庸:在技术上持续精进
- Java对List中的中文属性按照拼音排序
- 【JS】关键词 in
- lintcode--平衡二叉树
- C++ Primer Plus 第6版 编程题参考答案(1)
- 【CodeForces
- in typeof instanceof ===这些运算符有什么作用
- JAVA集合类(大公司面试喜欢问的)
- React Native 生命周期
- hdu 6129 Just do it (杨辉三角)
- BZOJ——1452
- SharePreferences源码分析(commit与apply的区别以及原理)
- java测试FTP服务器的上传、下载、删除文件
- 微信小程序:自定义弹出层