hdu 6025 Coprime Sequence (前后缀GCD)

本文介绍了解决HDU6025题目的一种算法思路。该问题要求在给定一组整数的情况下,通过删除其中一个数来最大化剩余数的最大公约数。文章详细解释了如何通过预处理数列的前缀和后缀最大公约数来实现高效的求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:hdu 6025 Coprime Sequence 

题意:

给你n个数,让你删掉一个数,使得剩下的数的gcd最大

题解:

先将这一列数的前缀后缀gcd预处理一下。

然后挨着for一下就行了

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=1e5+7;
 6 int t,pre[N],suf[N],n,a[N];
 7 
 8 int main()
 9 {
10     scanf("%d",&t);
11     while(t--)
12     {
13         scanf("%d",&n);
14         F(i,1,n)scanf("%d",a+i);
15         pre[1]=a[1],suf[n]=a[n];
16         F(i,2,n)pre[i]=__gcd(pre[i-1],a[i]);
17         for(int i=n-1;i>0;i--)suf[i]=__gcd(suf[i+1],a[i]);
18         int mx=0;
19         F(i,2,n-1)mx=max(mx,__gcd(pre[i-1],suf[i+1]));
20         mx=max(pre[n-1],mx),mx=max(suf[2],mx);
21         printf("%d\n",mx);
22     }
23     return 0;
24 }
View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/6863787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值