UVA 1642 MagicalGCD 题解
本题是一道区间最大公约数的模板题;
如果N^2暴力的话当然会超时,所以我们要发掘出区间gcd的特点;
设gcd[i]表示区间[1,i]的最大公约数;
我们可以发现,从一个点i到1之间的所有区间的gcd均满足gcd[j]=GCD(gcd[j-1],a[j]);
由于gcd的性质,所以gcd[]是单调不增的;
接着,我们似乎发现了一个更神奇的事情,g[]中不同的值最多有log(max(a[i]))个;
换句话说,虽然g[]数组的长度为n,但在以上两个条件的限制下,最多仅仅有logA个值发生改变的地方;
所以我们遍历一遍右端点,处理出每个i到j(0<=i<=j)的区间的最大公约数;
注意,这并不再是n^2了,因为从i到j在long long 范围内最多有64个不同的值,所以我们只要遍历一遍这些点i就可以知道所有的0<=i<=j到j的区间的gcd;
神奇吧?
综上所述,求出所有区间的gcd仅仅需要nlogA的时间,完全可以切掉这道题;
#include <bits/stdc++.h>
#pragma GCC optimize(3)
#define ll long long
using namespace std;
int n;
long long a[];
long long gcd(long long a,long long b)
{
if(b==) return a;
return gcd(b,a%b);
}
vector<pair<long long ,long long> > vec[]; //第一维是值,第二维是在枚举右端点所用的点的编号
int main ()
{
cin>>n;
for(register int i=;i<=n;i++){
scanf("%lld",&a[i]);
}
for(register int i=;i<=n;i++){
long long x=a[i],y=i;
vec[i].push_back(make_pair(x,y));
for(register int j=;j<vec[i-].size();j++){
if(x==) break;
long long GCD=gcd(x,vec[i-][j].first);
if(GCD!=x){
x=GCD;
y=vec[i-][j].second;
vec[i].push_back(make_pair(x,y));
}
}
}
long long ans=;
for(register int i=;i<=n;i++){
int w=vec[i].size()-;
for(register int j=;j<w;j++){
pair<long long,long long> p1=vec[i][j];
pair<long long,long long> p2=vec[i][j+];
ans=max(ans,p1.first*(i-p2.second)); //注意,i-p2.second却不加1的原因是因为该区间其实是[p2.second,i-1];
}
ans=max(ans,vec[i][vec[i].size()-].first*i);
}
cout<<ans;
}
UVA 1642 MagicalGCD 题解的更多相关文章
- Magical GCD UVA 1642 利用约数个数少来优化 给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量的值最大。输出这个最大值。
/** 题目:Magical GCD UVA 1642 链接:https://vjudge.net/problem/UVA-1642 题意:给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量 ...
- uva 1642 Magical GCD
很经典的题目,愣是没做出来.. 题意:给出一个序列,求一子序列,满足其GCD(子序列)* length(子序列)最大. 题解: 类似单调队列的思想,每次将前面所得的最大公约数与当前数进行GCD,若GC ...
- UVa 1642 - Magical GCD(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1642 Magical GCD(经典gcd)
题意:给你n(n<=100000)个正整数,求一个连续子序列使序列的所有元素的最大公约数与个数乘积最大 题解:我们知道一个原理就是对于n+1个数与n个数的最大公约数要么相等,要么减小并且减小至少 ...
- UVA - 1642 Magical GCD 数学
Magical GCD The Magical GCD of a nonempty sequence of positive integer ...
- UVa 1642 (综合) Magical GCD
题意: 给出一个数列,求一个连续的子序列,使得MGCD(i, j) = 该子序列的长度(j-i+1) × 子序列的gcd 最大,并输出这个最大值. 分析: 感觉可能要用优先队列,但貌似也用不上. 但 ...
- UVA 1642 Magical GCD(gcd的性质,递推)
分析:对于区间[i,j],枚举j. 固定j以后,剩下的要比较M_gcd(k,j) = gcd(ak,...,aj)*(j-k+1)的大小, i≤k≤j. 此时M_gcd(k,j)可以看成一个二元组(g ...
- UVa 1642 Magical GCD (暴力+数论)
题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点 ...
- 紫书 例题 10-29 UVa 1642(最优连续子序列)
这类求最优连续子序列的题一般是枚举右端点,然后根据题目要求更新左端点, 一般是nlogn,右端点枚举是n,左端点是logn 难点在于如何更新左端点 用一些例子试一下可以发现 每次加进一个新元素的时候 ...
随机推荐
- python基础--几个特性
1.helloword程序的解释 #!/usr/bin/python3 print("Hello, World!") 关于脚本第一行的 #!/usr/bin/python 的解释, ...
- 11、LineEdit与setCompleter自动补全
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug>//引入打印 ...
- APUE学习之进程控制 - fork 与 vfork
最后编辑: 2019-11-6 版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 一.进程标识 每一个进程都有一个唯一的非 ...
- Linux-expect脚本-1
expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 首行加上/usr/bin/expect spawn: 后面加上需要执行的shell命令,比如说spawn sudo ...
- Authing新功能——小程序扫码登录
近期,Authing 发布了新功能--小程序扫码登录. 小程序扫码登录指使用Authing小程序身份管家在网页端或其它客户端执行微信登录,目前的SDK仅支持客户端JavaScript.其它语言若想使用 ...
- 【学习】SpringBoot之全局异常处理器
/** * 全局异常处理器 **/ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exceptio ...
- python3笔记九:python数据类型-String字符串
一:学习内容 字符串概念 字符串运算 字符串函数:eval().len().lower().upper().swapcase().capitalize().title().center().ljust ...
- 石川es6课程---1-2、ES6简介
石川es6课程---1-2.ES6简介 一.总结 一句话总结: 从ECMAScript的历史发展来看,太顺了的时候总会遇到一挫折,比如ecma4 1.ECMAScript 和 JavaScript关系 ...
- dell 9代cpu新机器安装centos7.7 bios 配置
1.步骤如下,按f2或f12选择进入bios,每一步配置的内容如图所示,U盘写镜像,引导U盘启动,安装.(电源管理自启动那几个步骤可以不做)
- C#的语音识别 using System.Speech.Recognition;
using System; using System.Collections.Generic; using System.Linq; using System.Speech.Recognition; ...