C - GCD on Blackboard (atcoder.jp)
题意:
思路:
这道题,多看看样例大概就出来了
由样例可知,换成的数可以是其他N-1个数的gcd,这样对答案的贡献也没有影响
所以直接去枚举换的是什么数就行
因此怎么去快速求其他N-1个数的GCD就成了问题
这样trick非常经典,在牛客寒假营就出现过
它那个是前后缀背包,这个是前后缀GCD
(144条消息) 【前后缀背包】牛客寒假集训营4 D 清楚姐姐学01背包(Hard Version)_lamentropetion的博客-CSDN博客
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=2e5+10;
const int mxv=2e5+10;
const int mxe=1e6+10;
const int mod=1e9+7;
const int Inf=0x3f3f3f3f;
int N;
int a[mxn];
int pre[mxn],suf[mxn];
void solve(){
cin>>N;
for(int i=1;i<=N;i++) cin>>a[i];
for(int i=1;i<=N;i++) pre[i]=__gcd(pre[i-1],a[i]);
for(int i=N;i>=1;i--) suf[i]=__gcd(suf[i+1],a[i]);
int ans=0;
for(int i=1;i<=N;i++) ans=max(ans,__gcd(pre[i-1],suf[i+1]));
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}