CF --- 798 C Mike and gcd problem 【思维】
2017-08-18 18:45
330 查看
传送门
//题意给定一个序列, 问最少操作几次可以使这个序列的GCD大于1. 每次操作是指选取一个数a[i], 删去a[i]和a[i+1]. 并替换成a[i] - a[i-1], a[i] + a[i+1].
//思路: 首先分析是可以知道的一定会输出YES, 因为当全部都是偶数时就一定可以啊, a[i] - a[i-1], a[i] + a[i+1]这个操作一定是可以将奇数变成偶数的, 最多进行两次, 所以当全部都变成偶数时也就是我们所需要的序列了. 所以直接模拟做就行了, 最后记得判一下最后那个数是不是奇数. 是的话答案要加2. (不懂的话仔细看看代码理解理解就行了)
AC Code
//题意给定一个序列, 问最少操作几次可以使这个序列的GCD大于1. 每次操作是指选取一个数a[i], 删去a[i]和a[i+1]. 并替换成a[i] - a[i-1], a[i] + a[i+1].
//思路: 首先分析是可以知道的一定会输出YES, 因为当全部都是偶数时就一定可以啊, a[i] - a[i-1], a[i] + a[i+1]这个操作一定是可以将奇数变成偶数的, 最多进行两次, 所以当全部都变成偶数时也就是我们所需要的序列了. 所以直接模拟做就行了, 最后记得判一下最后那个数是不是奇数. 是的话答案要加2. (不懂的话仔细看看代码理解理解就行了)
AC Code
/** @Cain*/ const int maxn=1e5+5; int a[maxn]; void solve() { int n; while(~scanf("%d",&n)){ int g; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(i == 1) g = a[i]; else g = __gcd(g,a[i]); } if(g > 1 ){ printf("YES\n0\n"); continue; } //此时序列的总GCD一定是1. int res = 0; for(int i=1;i<n;i++){ while(a[i] & 1){ res++; int x = a[i]-a[i+1]; int y = a[i]+a[i+1]; a[i] = x; a[i+1] = y; } //全部变成偶数. } if(a & 1) res += 2; //特判最后一个数 puts("YES"); printf("%d\n",res); } }
相关文章推荐
- CF#798 C. Mike and gcd problem(思维)
- 798 C. Mike and gcd problem
- Codeforces 798C:Mike and gcd problem【数论+贪心】
- Codeforces Round #410 (Div. 2) Mike and gcd problem 思维
- CF#798 B. Mike and strings(思维)
- [CF798C] Mike and gcd problem(规律,gcd)
- Codeforces 798C:Mike and gcd problem
- Mike and gcd problem
- Codeforces Round #410 (Div. 2) C. Mike and gcd problem 贪心
- C. Mike and gcd problem-递推或者贪心
- C. Mike and gcd problem
- D - Mike and gcd problem
- 【算法系列学习】codeforces C. Mike and gcd problem
- C. Mike and gcd problem
- 789C Mike and gcd problem
- Mike and gcd problem CodeForces - 798C
- CF 361 E. Mike and Geometry Problem (排列组合+乘法逆元)
- 【codeforces 798C】Mike and gcd problem
- 【推导】Codeforces Round #410 (Div. 2) C. Mike and gcd problem
- Codeforces Round #410 (Div.2) C.Mike and gcd problem-数学