codeforces 798C - Mike and gcd problem 贪心
2017-05-24 10:57
609 查看
题意:如果一个序列B={b1,b2,b3,…,bn},其gcd(b1,b2,b3...bn)>1则称之为漂亮的。
现在给定一个长度为序列和一个操作,选定一个i(0<=i<n),分别用ai-ai+1,ai+ai+1代替原来的ai,ai+1。问最少操作几次,使得序列成为一个漂亮的序列(2<=n<=1e5)
思路:d|(a−b)
&& d|(a+b)
-> d|2a
&& d|2b
所以要将 gcd(ai)=1
转化成 gcd(ai)=2
。
一对奇数操作一次,即可变为偶数,一奇一偶要两个次。相邻两个都是奇数时,那么优先选择这两个数操作。
现在给定一个长度为序列和一个操作,选定一个i(0<=i<n),分别用ai-ai+1,ai+ai+1代替原来的ai,ai+1。问最少操作几次,使得序列成为一个漂亮的序列(2<=n<=1e5)
思路:d|(a−b)
&& d|(a+b)
-> d|2a
&& d|2b
所以要将 gcd(ai)=1
转化成 gcd(ai)=2
。
一对奇数操作一次,即可变为偶数,一奇一偶要两个次。相邻两个都是奇数时,那么优先选择这两个数操作。
#include<cstdio> #include<algorithm> using namespace std; const int maxn = 1e5+10; int a[maxn]; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } int d=__gcd(a[0],a[1]); int ans=0; for(int i=0;i<n;i++) { d=__gcd(d,a[i]); if((a[i]&1)&&(a[i+1]&1)) { i++; ans++; continue; } if(a[i]&1)ans+=2; } if(d!=1)printf("YES\n0\n"); else printf("YES\n%d\n",ans); } }
相关文章推荐
- Codeforces-798C-Mike and gcd problem(贪心+数论)
- Codeforces 798C:Mike and gcd problem【数论+贪心】
- 【codeforces 798C】Mike and gcd problem
- Codeforces 798C:Mike and gcd problem
- Mike and gcd problem-codeforces-Round 410 Div2-C
- C. Mike and gcd problem-递推或者贪心
- [CF798C] Mike and gcd problem(规律,gcd)
- Codeforces Round #410 (Div. 2) C. Mike and gcd problem 贪心
- Mike and gcd problem CodeForces - 798C
- Codefroces 410 C. Mike and gcd problem
- 789C Mike and gcd problem
- codeforces 798 D. Mike and distribution 二维贪心
- codeforces 798 D. Mike and distribution 二维贪心
- [Codeforces 689E] Mike and Geometry Problem (贡献计数+静态区间更新)
- codeforces 798 D. Mike and distribution 二维贪心
- CF798 C. Mike and gcd problem
- codeforces 798 D. Mike and distribution 二维贪心
- codeforces 442B B. Andrey and Problem(贪心)
- codeforces 798 D. Mike and distribution 二维贪心
- Mike and gcd problem Codeforces Round #410 (Div. 2)