考虑向一个集合里添加一个数,它们的gcd要么不变,要么变成原gcd的一个约数。因此不同的gcd只有log个。
所以对于每个位置,维护一个表,存储从这个位置向前所有的不同的gcd及其初始位置,然后暴力更新答案,反正这个表不会很长。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 100001
typedef long long ll;
typedef pair<ll,int> Point;
Point table[101],t[101];
int T,n,en,e2;
ll gcd(ll a,ll b){return (!b)?a:gcd(b,a%b);}
int main()
{
ll x;
scanf("%d",&T);
for(;T;--T)
{
ll ans=0;
en=0;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%lld",&x);
for(int j=1;j<=en;++j)
table[j].first=gcd(table[j].first,x);
table[++en]=make_pair(x,i);
sort(table+1,table+1+en);
e2=0;
for(int j=1;j<=en;++j)
if(table[j].first!=table[j-1].first)
t[++e2]=table[j];
en=e2;
memcpy(table+1,t+1,sizeof(Point)*e2);
for(int j=1;j<=en;++j)
ans=max(ans,table[j].first*(ll)(i-table[j].second+1));
}
printf("%lld\n",ans);
}
return 0;
}