UVa 1642 - Magical GCD(数论)
链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4517
题意:
输入一个n(n≤100000)个元素的正整数序列,求一个连续子序列,使得该序列中所有元素的最大公约数与序列长度的乘积最大。
例如,5个元素的序列30, 60, 20, 20, 20的最优解为{60, 20, 20, 20},乘积为gcd(60,20,20,20)*4=80。
分析:
从左到右枚举序列的右边界j,然后快速求出左边界i≤j,使得MGCD(i,j)最大。
其中MGCD(i,j)定义为gcd(a[i],a[i+1],...,a[j])*(j-i+1)。
考虑序列5, 8, 6, 2, 6, 8,当j=5时需要比较i=1, 2, 3, 4, 5时的MGCD(i,j),如下表所示:
i=1,gcd表达式=gcd(5,8,6,2,6),gcd值=1,序列长度=5。
i=2,gcd表达式=gcd(8,6,2,6),gcd值=2,序列长度=4。
i=3,gcd表达式=gcd(6,2,6),gcd值=2,序列长度=3。
i=4,gcd表达式=gcd(2,6),gcd值=2,序列长度=2。
i=5,gcd表达式=gcd(6),gcd值=6,序列长度=1。
从下往上看,gcd表达式里每次多一个元素,有时gcd不变,有时会变小,而且每次变小时一定是变成了它的某个约数。
换句话说,不同的gcd值最多只有logj种!当gcd值相同时,序列长度越大越好,所以可以把表简化一下:
gcd值=1,i=1。
gcd值=2,i=2。
gcd值=6,i=5。
因为表里只有logj个元素,所以可以依次比较每一个i对应的MGCD(i,j),时间复杂度为O(logj)。
下面考虑j从5变成6时,这个表会发生怎样的变化。
首先,上述所有gcd值都要再和a6=8取gcd,然后要加入i=6的项目,gcd值为8。
由于相同的gcd值只需要保留i的最小值,所以i=5被删除,最终得到如下表所示结果。
gcd值=1,i=1。
gcd值=2,i=2。
gcd值=8,i=6。
总时间复杂度为O(nlogn)。
代码:
#include <cstdio>
#include <vector>
using namespace std; typedef long long int LLI;
struct Item {
LLI g;
int p;
}; LLI gcd(LLI a, LLI b) {
return b == ? a : gcd(b, a%b);
} int main() {
int T, n;
LLI v, ans;
scanf("%d", &T);
while(T--) {
ans = ;
vector<Item> vec;
scanf("%d", &n);
for(int t = ; t < n; t++) {
scanf("%lld", &v);
for(int i = ; i < vec.size(); i++) vec[i].g = gcd(vec[i].g, v);
vec.push_back((Item){v,t});
vector<Item> nvec;
for(int i = ; i < vec.size(); i++) {
if(i != && vec[i].g == vec[i-].g) continue;
ans = max(ans, vec[i].g * (t-vec[i].p+));
nvec.push_back(vec[i]);
}
vec = nvec;
}
printf("%lld\n", ans);
}
return ;
}
UVa 1642 - Magical GCD(数论)的更多相关文章
- UVA - 1642 Magical GCD 数学
Magical GCD The Magical GCD of a nonempty sequence of positive integer ...
- UVa 1642 Magical GCD (暴力+数论)
题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点 ...
- uva 1642 Magical GCD
很经典的题目,愣是没做出来.. 题意:给出一个序列,求一子序列,满足其GCD(子序列)* length(子序列)最大. 题解: 类似单调队列的思想,每次将前面所得的最大公约数与当前数进行GCD,若GC ...
- UVA 1642 Magical GCD(经典gcd)
题意:给你n(n<=100000)个正整数,求一个连续子序列使序列的所有元素的最大公约数与个数乘积最大 题解:我们知道一个原理就是对于n+1个数与n个数的最大公约数要么相等,要么减小并且减小至少 ...
- 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 10951 - Polynomial GCD(数论)
UVA 10951 - Polynomial GCD 题目链接 题意:给定两个多项式,求多项式的gcd,要求首项次数为1,多项式中的运算都%n,而且n为素数. 思路:和gcd基本一样,仅仅只是传入的是 ...
- Magical GCD UVA 1642 利用约数个数少来优化 给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量的值最大。输出这个最大值。
/** 题目:Magical GCD UVA 1642 链接:https://vjudge.net/problem/UVA-1642 题意:给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量 ...
- uva 10951 - Polynomial GCD(欧几里得)
题目链接:uva 10951 - Polynomial GCD 题目大意:给出n和两个多项式,求两个多项式在全部操作均模n的情况下最大公约数是多少. 解题思路:欧几里得算法,就是为多项式这个数据类型重 ...
- 4052: [Cerc2013]Magical GCD
4052: [Cerc2013]Magical GCD Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 148 Solved: 70[Submit][ ...
随机推荐
- Access restriction: The type BASE64Encoder is not accessible due to restrict(转载)
Access restriction: The type BASE64Encoder is not accessible due to restrict 2011年11月18日 20:47:06 阅读 ...
- Python Django 获取表单数据的三种方式
# In viewsdef zbsservice(request): #返回一个列表 v1 = models.Business.objects.all() # .value返回一个字典 v2 = mo ...
- Implementation:Bellman-ford
单源最短路径算法Bellman-ford练习,可以处理有负边的情况(也可以在存在负圈时及时终止) #include <iostream> #include <cstdlib> ...
- Win8操作系统下IIS如何配置asp.net的运行环境(win7同样)
一.把鼠标放在电脑屏幕的左下角然后右击,弹出如下图菜单,选择“程序和功能”(快捷键win+X).(win7点击电脑左下角的“开始”,然后点击“控制面板”打开程序与功能界面): 二.进入程序与功能界面后 ...
- JS 中的布尔运算符 && 和 ||
布尔运算符 && 和 ||的返回结果不一定是布尔值!由此来展开一定的研究及理解. 1.首先先介绍下常见的数据类型转化为bool后的值. (常用地方)在if表达式中,javascript ...
- PHP 抽象类实现接口注意事项(含PHP与.Net的区别)
最近在学习Drupal8,看到源码里面一个抽象类BlockBase实现了一个接口BlockPluginInterface,但是并没有实现该接口的所有方法.然后我就不淡定了,因为之前是做.NET的,记忆 ...
- css清除浮动之天龙8步
1.父级div定义height. 2.结尾处加空div标签clear:both. 3.父级div定义伪类:after和zoom. 4.父级div定义overflow:hidden. 5.父级div定义 ...
- arcengine 正确绑定办法
if (!RuntimeManager.Bind(ProductCode.Engine)) { if (!RuntimeManager.Bind(ProductCode.Desktop)) { Mes ...
- L1 Cache, L2 Cache读取命中率与时钟周期计算
CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存.从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为8 ...
- python 字符串格式化符号含义及注释
字符串格式化符号含义 符号 说明 %C 格式化字符及其ASCII码 %S 格式化字符串 %d 格式化整数 %o 格式化无符号八进制数 %x 格式化无符号十六进制数 %X 格式化无符号十六进制数(大写) ...