[CF798C] Mike and gcd problem(规律,gcd)
2017-05-18 13:14
357 查看
题目链接:http://codeforces.com/contest/798/problem/C
题意:给n个数,和一种操作:把a(i)和a(i+1)变成a(i)-a(i+1)和a(i)+a(i+1)。问能不能把整个数列变成gcd>1,能的话输出最少步骤。
贪心地认为假如需要这种操作,那么gcd为2是最好的。
进行操作无非四种情况:奇奇 奇偶 偶奇 偶偶。奇偶和偶奇可以看成一种情况,而偶偶则不需要进行操作。只剩下奇奇。
进行一次操作后,会发现奇奇会变成偶偶。
再看奇偶,奇偶进行一次会变成奇奇,再进行一次就是偶偶。
那么先把奇奇的处理了,再找奇偶,偶奇的情况就行了。
题意:给n个数,和一种操作:把a(i)和a(i+1)变成a(i)-a(i+1)和a(i)+a(i+1)。问能不能把整个数列变成gcd>1,能的话输出最少步骤。
贪心地认为假如需要这种操作,那么gcd为2是最好的。
进行操作无非四种情况:奇奇 奇偶 偶奇 偶偶。奇偶和偶奇可以看成一种情况,而偶偶则不需要进行操作。只剩下奇奇。
进行一次操作后,会发现奇奇会变成偶偶。
再看奇偶,奇偶进行一次会变成奇奇,再进行一次就是偶偶。
那么先把奇奇的处理了,再找奇偶,偶奇的情况就行了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 100100; 5 int n, a[maxn]; 6 7 int main() { 8 // freopen("in", "r", stdin); 9 while(~scanf("%d", &n)) { 10 int g = 0; 11 for(int i = 1; i <= n; i++) { 12 scanf("%d", &a[i]); 13 g = __gcd(g, a[i]); 14 if(a[i] & 1) a[i] = 1; 15 else a[i] = 0; 16 } 17 if(g != 1) { 18 puts("YES\n0"); 19 continue; 20 } 21 int ret = 0; 22 for(int i = 1; i < n; i++) { 23 if(a[i] && a[i+1]) { 24 a[i] = a[i+1] = 0; 25 ret++; 26 } 27 } 28 for(int i = 1; i <= n; i++) { 29 if(a[i]) ret += 2; 30 } 31 printf("YES\n%d\n", ret); 32 } 33 }
相关文章推荐
- 【codeforces 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 贪心
- Mike and gcd problem CodeForces - 798C
- Codeforces-798C-Mike and gcd problem(贪心+数论)
- Codeforces Round #410 (Div.2) C.Mike and gcd problem-数学
- Mike and gcd problem Codeforces Round #410 (Div. 2)
- 789C Mike and gcd problem
- Codeforces Round #410 (Div. 2) Mike and gcd problem 思维
- Codeforces Round #410 (Div. 2) C. Mike and gcd problem 贪心
- C. Mike and gcd problem
- 【推导】Codeforces Round #410 (Div. 2) C. Mike and gcd problem
- Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)
- C. Mike and gcd problem-递推或者贪心
- #410div2C. Mike and gcd problem
- C. Mike and gcd problem
- Codefroces 410 C. Mike and gcd problem
- D - Mike and gcd problem
- Mike and gcd problem