Codeforces 798C:Mike and gcd problem

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

题目大意:给出一个大小为$n$的数列,每次操作可以使得$a_i=a_i-a_{i+1}$,$a_{i+1}=a_i+a_{i+1}$,问最少多少次操作可以使得$gcd\{a_i\}>1$.

dp

考虑$gcd(x,y)=1$的情况:若有$d \neq 1$,$d|x-y$且$d|x+y$,则有$d|2x$且$d|2y$,故$d=2$,也就是说$gcd(x-y,x+y)=1$或$2$.

故若对于初始数列$gcd\{a_i\}=1$,那么多次操作后得到$gcd\{a_i\}=2$.

于是问题就转化为了,将数列中所有元素变成偶数所需要的最少操作数.

可以用dp解决(好像用贪心也是可以的).

定义状态:

  • $dp[i][1]$为前$i-1$个数均为偶数,第$i$个数为奇数的最少操作数;
  • $dp[i][0]$为前$i-1$个数均为偶数,第$i$个数为偶数的最少操作数.

则有四种情况:

  1. 第$i$个数为偶数,第$i+1$个数为偶数时,将第$i+1$个数变成偶数不需要进行操作,而无法使第$i+1$个数变成奇数;
  2. 第$i$个数为偶数,第$i+1$个数为奇数时,将第$i+1$个数变成偶数需要进行$2$次操作,将第$i+1$个数变成奇数不需要进行操作;
  3. 第$i$个数为奇数,第$i+1$个数为偶数时,将第$i+1$个数变成偶数需要进行$2$次操作,而无法使第$i+1$个数变成奇数;
  4. 第$i$个数为奇数,第$i+1$个数为奇数时,将第$i+1$个数变成偶数需要进行$1$次操作,而无法使第$i+1$个数变成奇数;

复杂度为$O(nlg(Max\{a_i\}))$.

代码如下:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <string>
 5 #define N 100005
 6 using namespace std;
 7 typedef long long ll;
 8 int inf=10000000;
 9 int n,a[N],ans,dp[N][2];
10 bool p[N];
11 int gcd(int a,int b){
12     return b==0?a:gcd(b,a%b);
13 }
14 int main(void){
15     scanf("%d",&n);
16     for(int i=0;i<n;++i){
17         scanf("%d",&a[i]);
18         p[i]=a[i]%2;
19     }
20     ans=a[0];
21     for(int i=0;i<n;++i)ans=gcd(ans,a[i]);
22     if(ans==1){
23         dp[0][!p[0]]=inf;
24         for(int i=1;i<n;++i){
25             if(p[i]){
26                 dp[i][0]=min(dp[i-1][0]+2,dp[i-1][1]+1);
27                 dp[i][1]=min(dp[i-1][0],inf);
28             }else{
29                 dp[i][0]=min(dp[i-1][0],dp[i-1][1]+2);
30                 dp[i][1]=min(inf,inf);
31             }
32         }
33         if(dp[n-1][0]!=inf)printf("YES\n%d",dp[n-1][0]);
34         else printf("NO");
35     }else printf("YES\n0");
36 }

转载于:https://www.cnblogs.com/barrier/p/6747464.html

Codeforces 798C:Mike and gcd problem相关推荐

  1. 【Codeforces - 798C】 Mike and gcd problem(思维,贪心)

    题干: Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the sequence B = [b1, b2, .. ...

  2. G - Mike and gcd problem

    G - Mike and gcd problem Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the seq ...

  3. codeforces798C - Mike and gcd problem (数论+思维)

    原题链接:http://codeforces.com/contest/798/problem/C 题意:有一个数列A,gcd(a1,a2,a3...,an)>1 时称这个数列是"漂亮& ...

  4. Mike and gcd problem(思维)

    Mike has a sequence A = [a1, a2, -, an] of length n. He considers the sequence B = [b1, b2, -, bn] b ...

  5. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 离散化】

    任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...

  6. CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数)

    CodeForces - 1000D:Yet Another Problem On a Subsequence (DP+组合数) 题目大意:这题目啊,贼难理解- 定义一个数列是"好的&quo ...

  7. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. Codeforces 768E:Game of Stones

    Codeforces 768E:Game of Stones 题目链接:http://codeforces.com/contest/768/problem/E 题目大意:给定$n$堆石子,初始每堆$s ...

  9. 【CodeForces - 798A】Mike and palindrome (回文串,水题,字符串问题)

    题干: Mike has a string s consisting of only lowercase English letters. He wants to change exactly one ...

最新文章

  1. 13张图彻底搞懂分布式系统服务注册与发现原理
  2. 动手学深度学习(二)
  3. PHP_define和const的区别/获取所有常量get_defined_constant()
  4. 华为云平台使用手册_华为云首发全生命周期应用平台,四大能力解决政企上云五大难题...
  5. Ubuntu16.04换源
  6. Github入门详情教程
  7. eclipse搭建maven开发环境
  8. Oracle 11g Release 1 (11.1) Oracle 本文索引的四种类型
  9. 【马哥教育视频】cacti入门及进阶[已更新至第四段]
  10. Spark Architecture
  11. PCIe协议在具体实现时的大体框图
  12. OC, OD门和线与逻辑
  13. 频繁切换网卡,一款快速设置IP地址的工具,爽到爆。
  14. 本科生学习的一些心得
  15. 1038: 顺序表中重复数据的删除
  16. 在移动硬盘里移动视频文件到移动硬盘 另外一个文件夹 显示正在计算_移动硬盘也支持AES-256位硬件加密,希捷锦系列入手体验...
  17. linux通过xdm开启端口,Red Hat Linux 5.4 开启xdm远程访问
  18. python正则表达式(关于提取数字)
  19. Word2Vec+ Word Embedding
  20. java计算机毕业设计黑格伯爵国际英语贵族学校官网MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. python编程入门指南磁力下载-使用python 将bt转磁力链接
  2. python学习软件-学习python用什么软件
  3. javascript高级程序设计之BOM
  4. LeetCode Sort List(单链表归并排序)
  5. 在周末程序员可以做些什么?
  6. python面向对象三大特性之继承
  7. 使用Flask_SQLAlchemy连接多个数据库
  8. C#实现局部峰值查找,功能对应Matlab中的findpeaks.m
  9. /dev/null 位桶
  10. python3中的一些小改动