博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HackerRank The Chosen One [预处理][gcd]
阅读量:6292 次
发布时间:2019-06-22

本文共 1390 字,大约阅读时间需要 4 分钟。

题解:

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 
#include
#include
using namespace std;typedef long long LL;const int NICO = 100000 + 10;int n; vector
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; }}

  

转载于:https://www.cnblogs.com/RUSH-D-CAT/p/6399860.html

你可能感兴趣的文章
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>
java jvm GC 各个区内存参数设置
查看>>
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
关于FreeBSD的CVSROOT的配置
查看>>
基于RBAC权限管理
查看>>
数学公式的英语读法
查看>>
留德十年
查看>>
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>
数据库
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>