HackerRank The Chosen One [预处理][gcd]
题解:
tags:[预处理][gcd]
故事背景:光头钻进了茫茫人海。
这是一个典型の通过前缀后缀和来降低复杂度的问题。
先用pre数组与suf数组分别维护前缀gcd和后缀gcd。
如果 a[i] % gcd(pre[i-1], suf[i+1]) != 0;
那么光头就从人群中钻出来了!
gcd(pre[i-1],suf[i+1])就是我们要的答案。
注意n=1时的特判!
code:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
const int NICO = 100000 + 10;
int n; vector<int> v;
LL a[NICO], pre[NICO], suf[NICO];
LL gcd(LL x, LL y)
{
return (y==0)?x:gcd(y, x%y);
}
int main()
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
if(n == 1)
{
cout << (LL)2e18 << endl;
} else {
int pos = 0;
pre[1] = a[1]; suf[n] = a[n];
for(int i=2;i<=n;i++)
{
pre[i] = gcd(a[i], pre[i-1]);
}
for(int i=n-1;i>=1;i--)
{
suf[i] = gcd(a[i], suf[i+1]);
}
for(int i=2;i<=n-1;i++)
{
LL tmp = gcd(pre[i-1],suf[i+1]);
if(a[i] % tmp)
{
pos = i;
}
}
if(a[1] % suf[2]) pos = 1;
if(a[n] % pre[n-1]) pos = n;
// pos 表示光头出现的位置
if(pos==1) swap(a[1], a[2]), pos = 2;
LL res = a[1];
for(int i=2;i<=n;i++)
{
if(i!=pos) res = gcd(res, a[i]); // 碰见光头就跳过!
}
cout << res << endl;
}
}
HackerRank The Chosen One [预处理][gcd]的更多相关文章
- ECNU 3480 没用的函数 (ST表预处理 + GCD性质)
题目链接 ECNU 2018 JAN Problem E 这题卡了双$log$的做法 令$gcd(a_{i}, a_{i+1}, a_{i+2}, ..., a_{j}) = calc(i, j)$ ...
- HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...
- HDU 5726 GCD (RMQ + 二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 给你n个数,q个询问,每个询问问你有多少对l r的gcd(a[l] , ... , a[r]) ...
- [COJ0528]BJOI幸运数
[COJ0528]BJOI幸运数 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试 ...
- Codeforces 474F - Ant colony
注意到每个区间生存下来的蚂蚁的长度等于区间的gcd 于是可以先预处理出区间的gcd 然后二分查找就好了 预处理gcd我这里用的是倍增法 总的时间复杂度O(NlogN) /* Cf 271F 倍增求区间 ...
- Project Euler 453 Lattice Quadrilaterals 困难的计数问题
这是一道很综合的计数问题,对于思维的全面性,解法的过渡性,代码能力,细节处理,计数问题中的各种算法,像gcd.容斥.类欧几里德算法都有考察.在省选模拟赛中做到了这题,然而数据范围是n,m小于等于100 ...
- 10.9 guz模拟题题解
感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...
- Magolor的数据结构作业
\(CodeForces 706E ~Working routine\) 给出一个矩阵,每次操作交换两个子矩阵,求最后状态. 使用链表存储,每次交换后,影响到的之后矩阵边缘的指针,暴力修改. \(~~ ...
- X000010
P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意:求 \({\rm S}(n,m)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m{\rm lcm} ...
随机推荐
- HTML5拖放事件-上传图片预览功能
主要用到的知识点有dataTransfer对象和FileReader(读取文件信息) 1.创建简单的HTML标签: <body> <div id="box"> ...
- JTextArea与TextArea自动换行和滚动条的区别对比
最近在用Java写一个仿记事本的程序,但是发现用JTextArea写的效果有点差,但是用TextArea自动换行并不那么方便,经过对比和实践,我也发现自己对这两个标签认识存在不足,下面就来讨论一下他们 ...
- hibernate动态切换数据源
起因: 公司的当前产品,主要是两个项目集成的,一个是java项目,还有一个是php项目,两个项目用的是不同的数据源,但都是mysql数据库,因为java这边的开发工作已经基本完成了,而php那边任务还 ...
- iSCS协议介绍
1.iSCSI 协议说明 一种在 TCP/IP上进行数据块传输的标准,由Cisco 和 IBM 两家发起,并且得到了各大存储厂商的大力支持.iSCSI 可以实现在 IP 网络上运行SCSI协议,使其能 ...
- WPF DataGrid Drag
自己实现的功能.代码比较简单的DataGrid的Drag处理,着重处理DataGrid里的拖动排序. using System; using System.Collections.Generic; u ...
- python算法(一)
python算法(一) 一.求数x的因子 x=100 divisors=()#初始化空的元组 for i in range(1,x): if x%i==0: divisors=divisors+(i, ...
- 【Harmony】概述
原文来自本人的微信公众号文章 系统工程实验室 引言 基于模型的系统工程(简称MBSE,英文全称Model based System Engineering )的实践至少需要三个维度的支撑 ...
- C++:基础篇-32位和64位系统区别及字节数
今儿面试了一个刚刚毕业的,但是不知道一个int.long.double这几个都是多少位,我给你们总结一下哈: 常用数据类型对应字节数 可用如sizeof(char),sizeof(char*)等得出 ...
- thinkphp join加别名
//此段代码在某个Model里面$tbpre = $this->tableprefix;$Aaa = M('aaa');$Aaa->table(array("{$tbpre}aa ...
- JAVA面试题和答案(二)
本文我们将要讨论Java面试中的各种不同类型的面试题,它们可以让雇主测试应聘者的Java和通用的面向对象编程的能力.下面的章节分为上下两篇,第一篇将要讨论面向对象编程和它的特点,关于Java和它的功能 ...