Magical GCD UVA 1642 利用约数个数少来优化 给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量的值最大。输出这个最大值。
2017-04-27 18:51
555 查看
/** 题目:Magical GCD UVA 1642 链接:https://vjudge.net/problem/UVA-1642 题意:给定n个数,求使连续的一段序列的所有数的最大公约数*数的数量的值最大。输出这个最大值。 思路: 从左到右枚举一段连续序列时候,同时不断取gcd,会发现gcd相同的部分。 gcd的值会随着长度边长非递增变化。最多logx个不同的gcd。那么对于一个长长的序列。 要是可以将相同gcd的一起处理,那么时间就可以优化。 枚举姿势要正确,保证当前枚举的位置,可以利用前面的结果。 常规枚举姿势,右边界位置从左到右枚举,然后枚举左边界位置j<=i从右往左枚举。 用d,l两个数组存储信息。 ll d[maxn];//d[i]表示到达i这个位置的最大公约数 ll l[maxn];//l[i]表示i这个位置到l[i]这个位置的最大公约数相同。 */ #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<vector> #include<set> #include<cmath> using namespace std; typedef long long ll; typedef unsigned long long ull; const int inf = 0x3f3f3f3f; const int maxn = 1e5+100; ll d[maxn];//d[i]表示到达i这个位置的最大公约数 ll l[maxn];//l[i]表示i这个位置到l[i]这个位置的最大公约数相同。 int T, n; ll a[maxn]; ll GCD(ll a,ll b) { return b==0?a:GCD(b,a%b); } int main() { cin>>T; while(T--) { scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%lld",&a[i]); ll ans = 0; for(int i = 1; i <= n; i++){ d[i] = a[i]; l[i] = i; ll gcd = a[i]; ll pos = l[i]; ll lastpos = pos; ans = max(ans,a[i]); pos--; while(pos>=1){ pos = l[pos]; ll gcdl = GCD(gcd,d[pos]); ans = max(ans,gcdl*(i-pos+1)); if(gcdl==gcd){ l[lastpos] = pos; d[pos] = gcdl; }else { gcd = gcdl; lastpos = pos; d[pos] = gcdl; } pos--; } } printf("%lld\n",ans); } return 0; }
相关文章推荐
- UVA-1642-MagicalGCD[区间最大公约数]
- 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), 使得这个“子数组”的和是所有“子数组”和中最大的
- 编写一段程序,从标准输入读取string对象的序列直到连续出现两个相同的单词或者所有单词都读完为止。使用while循环一次读取一个单词,当一个单词连续出现两次是使用break语句终止循环。输出连续重复出现的单词,或者输出一个消息说明没有人任何单词是重复出现的。
- 求两个字符串的最大公共子序列(可以不连续)的长度,并输出这个子序列
- UVA - 1642 Magical GCD(nlogn传统算法思想 序列较短的维护队列)
- Trees in a Wood. UVA 10214 欧拉函数或者容斥定理 给定a,b求 |x|<=a, |y|<=b这个范围内的所有整点不包括原点都种一棵树。求出你站在原点向四周看到的树的数量/总的树的数量的值。
- 输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)。1<=18,-10<=Si<=10
- 1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) 2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 3.将三个数按从大到小输出。 4.求两个数的最大公约数。
- 取数组中和最大的一段连续序列
- 输入一个正数 n,输出所有和为 n 连续正数序列。
- FZU 1969 GCD Extreme,UESTC 1723 吴神的大脑: _数论好题(求1-n中所有数的最大公约数之和)
- 利用递归方法求最大公约数 gcd
- 给定入栈序列1、2、3、4、5,输出所有的出栈序列和总数
- 输入一个正数 n,输出所有和为n 连续正数序列。
- 给定长度为n的整数数列:a0,a1,..,an-1,以及整数S。这个数列会有连续的子序列的整数总和大于S的,求这些数列中,最小的长度。
- 输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
- 网易笔试题:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 输入一个正数n,输出所有和为n连续正数序列
- Maximum GCD - UVa 11827 最大公约数 读入有坑
- 输入一个正数n,输出所有和为n连续正数序列。