题意:就是找个连续子序列,使得长度乘上这个子序列的gcd的值最大。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
map<ll, ll>v;
map<ll,ll>::iterator it,itt;
ll a[110000];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
ll Max = -1;
int n;
v.clear();
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
Max = max(a[i], Max);
for(it= v.begin(); it != v.end();it++)
{
if(__gcd(it->first,a[i]) != it->first)
{
if(v[__gcd(it->first,a[i])] == 0)
v[__gcd(it->first,a[i])] = it->second;
itt = it++;
v.erase(itt);
it--;
}
}
if(!v[a[i]])
v[a[i]]=i;
for(it = v.begin(); it != v.end(); it++)
{
Max = max(Max, (it->first)*(i - it->second + 1));
}
}
printf("%lld\n",Max);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define ll long long
map<ll, ll>v;
int main()
{
int t;
ll x;
scanf("%d", &t);
while(t--)
{
v.clear();
int n;
scanf("%d", &n);
ll ans = -1;
for(int i = 1; i <= n; i++)
{
scanf("%lld",&x);
if(!v.count(x))
v[x] = i;
for(map<ll, ll>::iterator it = v.begin(); it!= v.end(); )
{
ll tmp = __gcd(it->first, x);
ans = max(ans, (tmp)*(i-it->second+1));
if(!v.count(tmp))
{
v[tmp] = it->second;
}
else
{
v[tmp] = min(v[tmp],it->second);
}
if(tmp<it->first) v.erase(it++);
else it++;
}
}
printf("%lld\n",ans);
}
}