题意:一个长度为n的数列,选一个连续子序列,使得子序列的公约数*长度最大,求这个最大值
题解:对于这种问题,我们一般都考虑滑动窗口解法就能解决,这里采用map模拟。。。
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<time.h>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long
#define lowbit(x) (x&-x)
#define inf 2147483647
#define mod 998244353
#define maxn 5005
#define eps 1e-9
map<ll,ll>q;
ll gcd(ll x,ll y)
{
if(y==0)
return x;
return gcd(y,x%y);
}
int main(void)
{
ll x,i,n,T;
scanf("%lld",&T);
while(T--)
{
ll ans=0;
q.clear();
scanf("%lld",&n);
for(i=1;i<=n;i++)
{
scanf("%lld",&x);
if(q.count(x)==0)
q[x]=i;
map<ll,ll>::iterator it;
for(it=q.begin();it!=q.end();)
{
ll tmp=gcd(x,it->first);
ans=max(ans,tmp*(i-it->second+1));
if(q.count(tmp)==0)
q[tmp]=it->second;
else
q[tmp]=min(q[tmp],it->second);
if(tmp<it->first)
q.erase(it++);
else
it++;
}
}
printf("%lld\n",ans);
}
return 0;
}