hdu 6025 前缀 后缀 gcd
Posted Pacify
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 6025 前缀 后缀 gcd相关的知识,希望对你有一定的参考价值。
大致题意:
去掉一个元素能使这个数列的GCD最大为多少
分析:
我们求一个数列的GCD,是先求前两个元素的GCD,然后将这个GCD值在与下一个元素进行GCD运算。由此可知进行GCD运算的顺序对最终的结果是没有影响的。我们再看看数列的长度范围,小于100000。那我们就枚举去掉的那个元素,那么去掉元素后的数列的GCD即这个元素前面一段数列的GCD再与这个元素后面一段数列的GCD进行GCD运算。所以我们需要两个数组分别记录前缀GCD和后缀GCD,这两个数组都可以通过O(n)算法算出来。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int a[100000+5]; int pre[100000+5],suf[100000+5]; int gcd(int a, int b) { while(b) { int c = a%b; a = b; b = c; } return a; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=0; i<n; i++) scanf("%d",&a[i]); pre[0]=a[0]; for(int i=1; i<n; i++) { pre[i]=gcd(pre[i-1],a[i]); } suf[n-1]=a[n-1]; for(int i=n-2; i>=0; i--) { suf[i]=gcd(suf[i+1],a[i]); } int ans=max(suf[1],pre[n-2]); for(int i=1;i<n-1;i++) { ans=max(ans,gcd(pre[i-1],suf[i+1])); } printf("%d\n",ans); } return 0; }
以上是关于hdu 6025 前缀 后缀 gcd的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 6025 Coprime Sequence(gcd+前缀后缀)
hdu 6025 Coprime Sequence (前后缀GCD)