cf 798c Mike and gcd problem
来源:互联网 发布:兰州大学网络教育入口 编辑:程序博客网 时间:2024/06/05 15:54
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 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.
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.
#include<iostream>#include<cstdio>#include<string.h>#include<math.h>#include<string>#include<map>#include<set>#include<vector>#include<algorithm>#include<queue>using namespace std;const int INF = 0x3f3f3f3f;const int NINF = 0xc0c0c0c0;int gcd(int a,int b){ if(b) while((a%=b) && (b%=a)); return a+b;}int main(){ int n; int num[100005]; memset(num,0,sizeof(num)); cin >> n; for(int i=0;i<n;i++){ cin >> num[i]; } int temp; for(int i=0;i<n;i++){ if(i==0){ temp = gcd(num[i],num[i+1]); } else{ temp = gcd(temp,num[i]); } } if(temp > 1){ cout << "YES" << endl; cout << 0 << endl; } else{ int cnt = 0; for(int i=0;i<n-1;i++){ if(num[i]&1==0 && num[i+1]&1==0) continue; if(num[i]&1 && num[i+1]&1){ num[i+1] = num[i]+num[i+1]; cnt++; continue; } else if(num[i]&1){ num[i+1] = 2; cnt += 2; continue; } } if(num[n-1]&1) cnt+=2; cout << "YES" << endl; cout << cnt << endl; }}
- cf 798c Mike and gcd problem
- CF#798 C. Mike and gcd problem(思维)
- CF --- 798 C Mike and gcd problem 【思维】
- Codeforces 798C Mike and gcd problem
- 798 C. Mike and gcd problem
- codeforces 798C Mike and gcd problem
- CodeForces 798C Mike and gcd problem
- Codeforces 798C Mike and GCD problem
- C. Mike and gcd problem
- C. Mike and gcd problem
- Codeforces 798C Mike and gcd problem gcd+贪心
- codeforce 798C Mike and gcd problem (简单数学)
- Codeforces-798C-Mike and gcd problem(贪心+数论)
- Codeforces 798C Mike and gcd problem (贪心)
- Codeforces 798C:Mike and gcd problem【数论+贪心】
- Codefroces 410 C. Mike and gcd problem
- 789C Mike and gcd problem
- Mike and gcd problem
- 【IMWeb训练营作业】Selector
- 中缀表达式转换为后缀表达式
- [TensorFlow]使用Tensorboard实现神经网络可视化
- android:descendantFocusability用法简析
- (ssl1014)P1049 装箱问题
- cf 798c Mike and gcd problem
- 创建指定大小图像并设置像素颜色
- 石子归并
- Hbase数据迁移(二)
- tomcat部署servlet web项目时 表格中文乱码
- 自定义搜索框---ZJSearchBar
- 关于onActivityResult回调问题
- Animation动画之View Animation(补间动画)
- Python中的操作符