Description

给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列
{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R) = (R-L+1) ∗ gcd (Al..Ar)。
JYY 希望找出权值最大的子序列。

Input

输入一行包含一个正整数 N。
接下来一行,包含 N个正整数,表示序列Ai
1 < =  Ai < =  10^12, 1 < =  N < =  100,000

Output

输出文件包含一行一个正整数,表示权值最大的子序列的权值。

考虑暴力:
枚举右端点,再暴力枚举左端点,更新答案,时间复杂度为 $O(n^2log(10^{12}))$.  
当一段区间的 $gcd$ 的值都相同时,我们只会取左端点最靠左的,这样显然最优.
而右端点固定时,区间左端点越靠左, $gcd$ 的值会越小,那么我们就能减少决策点
由于已知能对答案起贡献的 $gcd$ 都是会不相同的,而每次 $gcd$ 向左都会减小,且至少 $/2$ (或不变)
那么每次只需枚举那 $O(log(10^{12}))$ 个左端点.
我们得到了一个做法:
依次枚举右端点,右端点每次增加 $1$,原先右端点所对应的决策点都要保留,并与新的右端点的值取 $gcd$,并加入右端点的值. 
每次这么更新一下并删掉相同的数即可.
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 100004
#define ll long long
using namespace std; ll gcd(ll a,ll b) {
return b?gcd(b,a%b):a;
} ll arr[maxn],gc[maxn];
int pos[maxn],b[maxn]; int main() {
// setIO("input");
int n,i,j,top=0,tmp=0;
ll ans=0;
scanf("%d",&n);
for(i=1;i<=n;++i) {
scanf("%lld",&arr[i]);
for(j=1;j<=top;++j) gc[j]=gcd(gc[j],arr[i]);
gc[++top]=arr[i], pos[top]=i;
b[tmp=1]=1;
for(j=2;j<=top;++j) if(gc[j]!=gc[j-1]) b[++tmp]=j;
top=0;
for(j=1;j<=tmp;++j) {
gc[++top]=gc[b[j]],pos[top]=pos[b[j]];
ans=max(ans,1ll*(i-pos[top]+1)*gc[top]);
}
}
printf("%lld\n",ans);
return 0;
}

  

BZOJ 4488: [Jsoi2015]最大公约数 暴力 + gcd的更多相关文章

  1. bzoj 4488 [Jsoi2015]最大公约数 结论+暴力

    [Jsoi2015]最大公约数 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 302  Solved: 169[Submit][Status][Dis ...

  2. [BZOJ 4488][Jsoi2015]最大公约数

    传送门 不知谁说过一句名句,我们要学会复杂度分析 #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) for( ...

  3. BZOJ 4488/4052 gcd

    思路: 一开始 我是想 对于固定的左端点 从左到右 最多有 log种取值  且单调递减  那不妨倍增预处理+二分GCD在哪变了.. 复杂度O(nlog^2n) gcd最多log种取值.. 好了我们可以 ...

  4. 洛谷 P5502 - [JSOI2015]最大公约数(区间 gcd 的性质+分治)

    洛谷题面传送门 学校模拟赛的某道题让我联想到了这道题-- 先讲一下我的野鸡做法. 首先考虑分治,对于左右端点都在 \([L,R]\) 中的区间我们将其分成三类:完全包含于 \([L,mid]\) 的区 ...

  5. BZOJ4488: [Jsoi2015]最大公约数

    Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R ...

  6. 数据结构与算法分析 - 最大公约数(gcd & extended_gcd)

    以下内容均节选自<算法导论>第31章 最大公约数 定义:若:\[\begin{array}{l}a = p_1^{e_1}p_2^{e_2} \ldots p_r^{e_r}\\b = p ...

  7. 欧几里得算法求最大公约数(gcd)

    关于欧几里得算法求最大公约数算法, 代码如下: int gcd( int a , int b ) { if( b == 0 ) return a ; else gcd( b , a % b ) ; } ...

  8. 求最大公约数(GCD)的两种算法

    之前一直只知道欧几里得辗转相除法,今天学习了一下另外一种.在处理大数时更优秀的算法--Stein 特此记载 1.欧几里得(Euclid)算法 又称辗转相除法,依据定理gcd(a,b)=gcd(b,a% ...

  9. [CodeForces-1036E] Covered Points 暴力 GCD 求交点

    题意: 在二维平面上给出n条不共线的线段,问这些线段总共覆盖到了多少个整数点 解法: 用GCD可求得一条线段覆盖了多少整数点,然后暴力枚举线段,求交点,对于相应的 整数交点,结果-1即可 #inclu ...

随机推荐

  1. mysql如何下载历史版本?

    进入官网 www.mysql.com

  2. (5.1.5)引擎管理——多服务器管理之中央管理服务器(CMS)

    关键词:中央管理服务器,CMS,多服务器管理 中央管理服务器 -[1]打开 视图->已注册的服务器 [2]注册中央管理服务器 右击中央管理器->注册中央管理服务器 这里输入IP.主机名都可 ...

  3. dp常见优化方法

    noip范围内的dp优化方法: 加速状态转移 1.前缀和优化 2.单调队列优化 3.线段树或树状数组优化 精简状态 3:精简状态往往是通过对题目本身性质的分析,去省掉一些冗余的状态.相对以上三条套路性 ...

  4. TCP和UDP头部格式的了解?

    tcp头部格式如下图所示: 1.源端口号,16位,发送方的端口号. 2.目标端口号,16位,发送方的目标端口号. 3.  32为序列号,sequence number,保证网络传输数据的顺序性. 4. ...

  5. python2.7.5升级到2.7.14或者直接升级到3.6.4

    python2.7.5升级到2.7.14 1.安装升级GCC yum install -y gcc* openssl openssl-devel ncurses-devel.x86_64  bzip2 ...

  6. [转载]Linux内核编译

    原文地址:https://blog.csdn.net/qq_34247099/article/details/50949720 写在前面的话: 本人大二,东南大学一个软工狗,正在修一门名为<操作 ...

  7. 085、如何快速部署 Prometheus (2019-05-07 周二)

    参考https://www.cnblogs.com/CloudMan6/p/7724576.html   部署环境:       两台 Docker Host 10.12.31.211 10.12.3 ...

  8. api接口统一封装

    具体的接口api模块,例如authorization.js import axios from '../axiosWrapper' let prefix = process.env.API_ROOT ...

  9. ip - Linux IPv4 协议实现

    SYNOPSIS(总览) #include <sys/socket.h> #include <net/netinet.h> tcp_socket = socket(PF_INE ...

  10. 关于form表单回车自动刷新

    现象: form表单,输入框聚焦后,回车,页面刷新跳转. 原因: form表单,在只有一个输入框的时候,在点击回车时,就会触发表单的提交,而form若没有url,则提交后就会刷新页面,导致跳转. 解决 ...