RT,这题提交好多次了,不知道为什么总是TLE,但是时间复杂度又没有问题。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
const int N=100009;
long long st[N][30];
int lg[N],n;
long long a[N];
long long res=0;
inline long long query(int l,int r)
{
int x=log2(r-l+1);
return __gcd(st[l][x],st[r-(1ll<<x)+1][x]);
}
inline int erfen(int lef,long long s)
{
register int l=lef,r=n,mid,ans=lef;
while(l<=r)
{
mid=(l+r)>>1;
if(query(lef,mid)==s)
{
l=mid+1;
ans=mid;
}
else r=mid-1;
}
return ans;
}
int T;
int main()
{
scanf("%d",&T);
// for(int i=2;i<=100000;i++)
// lg[i]=lg[i/2]+1;
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&st[i][0]);
for(register int j=1;j<=20;j++)
for(register int i=1;i<=n-(1<<j)+1;i++)
{
st[i][j]=__gcd(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
res=0;
for(register int i=1;i<=n;i++)
{
for(register int j=i,next=0;j<=n;j=next+1)
{
next=erfen(i,query(i,j));
// cout<<i<<" "<<j<<" "<<next<<endl;
res=max(res,1ll*(next-i+1)*query(i,j));
}
}
printf("%lld\n",res);
}
return 0;
}