codeforces#410C Mike and gcd problem
题意:给一个序列a1到an ,如果gcd(a1,a2,...an)≠1,给一种操作,可以使ai和ai+1分别变为(ai+ai+1)和(ai-ai+1);问需要执行几次这个操作才能使得gcd(a1,a2,...an)>1.
分析:
1.首先,答案总是YES。
2,假设gcd(a1,a2,...an)=1,在一次对ai和ai+1的操作后新的gcd为d,则d满足:d|ai - ai + 1 and d|ai + ai + 1
d|2ai and d|2ai + 1.。同样,因为d是新序列的gcd,所以d也满足: d|aj, j ≠ i, i + 1.
3.从而我们得到:
。所以gcd(a1,a2,...an)=1,则在一次操作后,序列的gcd最多会变得两倍大.(即会变成2.)
4.这意味着如果我们要是序列的gcd大于1的话只用使所有的数为偶数即可。
5.因为两个奇数只通过一次操作即都可以变成偶数,而一奇一偶要通过两次才可以都变成偶数。
6.可以把题目转化为:给一个序列a1到an ,如果gcd(a1,a2,...an)≠1,求将所有数变成偶数需要的操作次数
7.又可转化为:求序列中有几段连续为奇数,如果使奇数段中含的数为偶数个k,则需要k/2次,如果为奇数个,则需要(k/2)+2次;
代码:
/*
Problem: C. Mike and gcd problem
Time: 2017/5/5/19:21
*/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#define ll long long
#define inf 100000000
using namespace std; ll a[];
ll gcd(ll a,ll b)
{
return b==?a:gcd(b,a%b);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%I64d",a+i);
ll d=a[];
for(int i=;i<n;i++)
d=gcd(d,a[i]);
int ans=;
if(d<=)
{
int odd=;
for(int i=;i<n;i++)
{
if(a[i]%!=) odd++;
else if(odd!=)
{
ans+=(odd%==?(odd/):(odd/+));
odd=;
}
}
//cout<<ans<<endl;
if(odd) ans+=(odd%==?(odd/):(odd/+));
}
printf("YES\n");
printf("%d\n",ans);
return ;
}
补充:(关于DIVISIBILITY AND GREATEST COMMON DIVISORS)
几个定理:
1.. Let a, b ∈ Z with a|b. Then a|bc for any c ∈ Z.
2. If a|b and b|c then a|c.
3.If a|b and a|c then a|(br + cs) for every r and s in Z. In particular, if a|b and a|c then a|(b + c) and a|(b − c).
4.For nonzero a and b in Z, there are x and y in Z such that (3.2) (a, b) = ax + by.
codeforces#410C Mike and gcd problem的更多相关文章
- Codeforces 798C. Mike and gcd problem 模拟构造 数组gcd大于1
C. Mike and gcd problem time limit per test: 2 seconds memory limit per test: 256 megabytes input: s ...
- 【算法系列学习】codeforces C. Mike and gcd problem
C. Mike and gcd problem http://www.cnblogs.com/BBBob/p/6746721.html #include<iostream> #includ ...
- Codeforces 798C - Mike and gcd problem(贪心+数论)
题目链接:http://codeforces.com/problemset/problem/798/C 题意:给你n个数,a1,a2,....an.要使得gcd(a1,a2,....an)>1, ...
- codeforces 798c Mike And Gcd Problem
题意: 给出一个数列,现在有一种操作,可以任何一个a[i],用a[i] – a[i+1]和a[i]+a[i+1]替代a[i]和a[i+1]. 问现在需要最少多少次操作,使得整个数列的gcd大于1. 思 ...
- codeforces 798C.Mike and gcd problem 解题报告
题目意思:给出一个n个数的序列:a1,a2,...,an (n的范围[2,100000],ax的范围[1,1e9] ) 现在需要对序列a进行若干变换,来构造一个beautiful的序列: b1,b2, ...
- Codeforces Round #410 (Div. 2)C. Mike and gcd problem
题目连接:http://codeforces.com/contest/798/problem/C C. Mike and gcd problem time limit per test 2 secon ...
- CF798 C. Mike and gcd problem
/* CF798 C. Mike and gcd problem http://codeforces.com/contest/798/problem/C 数论 贪心 题意:如果一个数列的gcd值大于1 ...
- #410div2C. Mike and gcd problem
C. Mike and gcd problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- CodeForces 689E Mike and Geometry Problem (离散化+组合数)
Mike and Geometry Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/I Description M ...
随机推荐
- idea设置代码颜色主题(同Sublime Text 3的代码颜色一样)
1.下载主题的网址:http://color-themes.com,主题种类多,总有适合你的主题.在这个网址下载的主题是jar文件,直接导入,如下图file->import Setting,找 ...
- 10.Git分支-分支管理(git branch命令)、分支开发工作流
1.分支管理 git branch 不仅可以创建和删除分支,还可以做一些其他工作. 1.不带参数的 git branch ,得到本地仓库当前的分支列表.并且会显示,当期所在的分支,也就是HEAD所指 ...
- 【Spark篇】---Spark故障解决(troubleshooting)
一.前述 本文总结了常用的Spark的troubleshooting. 二.具体 1.shuffle file cannot find:磁盘小文件找不到. 1) connection timeout ...
- 快速搭建WebAPI(Odata+Code-First)附Odata条件查询表~
Odata是什么? 开放数据协议(Open Data Protocol,缩写OData)是一种描述如何创建和访问Restful服务的OASIS标准.该标准由微软发起,前三个版本1.0.2.0.3.0都 ...
- 使用ML.NET实现白葡萄酒品质预测
导读:ML.NET系列文章 本文将基于ML.NET v0.2预览版,介绍机器学习中的分类和回归两个重要概念,并实现白葡萄酒品质预测. 本系列前面的文章也提到了一些,经典的机器学习最主要的特点就是模拟, ...
- 爬虫入门(三)——动态网页爬取:爬取pexel上的图片
Pexel上有大量精美的图片,没事总想看看有什么好看的自己保存到电脑里可能会很有用 但是一个一个保存当然太麻烦了 所以不如我们写个爬虫吧(๑•̀ㅂ•́)و✧ 一开始学习爬虫的时候希望爬取pexel上的 ...
- ubuntu 15.10 设置静态ip 分配固定ip 设置dns 设置网关 命令行配置ip 固定ip不生效怎么办
要用到的文件: 配置接口信息 /etc/network/interfaces 配置内容: auto eth0 iface eth0 inet static address 192.168.216.18 ...
- MVC基本开发介绍 (1)列表展示
前言: 现在如果用.net 的解决方案来做网站或者是网站的后台管理系统,MVC 应该是比较流行的. 自从进了新公司后,也一直在用mvc + webapi 来做项目,这里做个分享性的总结,有更好的方法欢 ...
- 算法工程师想进一步提高竞争力?向TensorFlow开源社区贡献你的代码吧
算法工程师为什么也要向社区贡献代码? [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] “做算法的人要熟悉算法框架源码吗?算法工程师难 ...
- python-操作文件和目录
操作文件和目录 为文件和目的操作经常用到os模块和shutil模块. 常用方法: 获取当前脚本工作的目录路径:os.getcwd(),返回的是str类型. 返回指定目录下的所有文件和目录名:os.li ...