Codeforces 798C - Mike and gcd problem(贪心+数论)

题目链接:http://codeforces.com/problemset/problem/798/C

题意:给你n个数,a1,a2,....an。要使得gcd(a1,a2,....an)>1,可以执行一次操作使ai,ai+1变为ai - ai + 1, ai + ai + 1。求出使得gcd(a1,a2,....an)>1所需要的最小操作数。

解题思路:首先,要知道如果能够实现gcd(a1,a2,....an)>1,那么a1~an肯定都是偶数(0也是偶数),所以我们的目的就是用最少的操作次数把所有数变成偶数。如果两个数都是奇数,那需要操作一次(奇数加减变成偶数),如果是偶数和奇数,那需要操作两次(奇数和偶数加减得到奇数,奇数再和奇数加减得到偶数),所以不存在gcd不能大于1的情况

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int N=1e5+5;
 5 int gcd(int a,int b){
 6     return b==0?a:gcd(b,a%b); 
 7 }
 8 
 9 int main(){
10     int n,tmp=0;
11     int a[N]={0};
12     cin>>n;
13     for(int i=1;i<=n;i++){
14         cin>>a[i];
15         tmp=gcd(tmp,a[i]);
16     }
17     if(tmp!=1)//如果不需要操作就得到gcd>1,直接输出0次;
18         cout<<"YES"<<"\n"<<"0"<<endl;
19     else{
20         int ans=0;
21         for(int i=1;i<n;i++){//找奇奇 
22             if(a[i]&1&&a[i+1]&1){
23                 ans++;
24                 a[i]=a[i+1]=2; 
25             }
26         }
27         for(int i=1;i<n;i++){
28             if(a[i]&1||a[i+1]&1){//找奇偶或者偶奇 
29                 ans+=2;
30                 a[i]=a[i+1]=2;
31             }
32         }
33         cout<<"YES"<<endl;
34         cout<<ans<<endl;
35     }
36     return 0;
37 }
38 
39  

 

。因为要求的最小操作数,所以我们要先找奇奇的情况,再找奇偶或者偶奇的情况。

 

转载于:https://www.cnblogs.com/fu3638/p/6754043.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值