魔法GCD Magical GCD
题面翻译
给一个长度为 n n n( n ≤ 1 0 5 n\le 10^5 n≤105)的数列 a a a( a i ≤ 1 0 12 a_i\le 10^{12} ai≤1012),找到一个连续子序列使得子序列的公约数与长度的乘积最大,求这个最大值。共 T T T 组数据。
输入格式:
第一行一个非负整数 T T T。
接下来每一组数据:
第一行一个正整数 n n n,第二行包含 n n n 个正整数 a i a_i ai。
输出格式:
共 T T T 行,每行一个非负整数表示答案。
题目描述
输入格式
输出格式
代码
#include <bits/stdc++.h>
using namespace std;
long long a[100010],b[100010];
long long ne[100010],s[100010];
int T;
int n;
long long __gcd(long long x,long long y)//要手打,不然达不到longlong
{
return y==0?x:__gcd(y,x%y);
}
long long max(long long a,long long b)//max也一样
{
return a>b?a:b;
}
int main()
{
cin>>T;
while(T--)
{
memset(s,0,sizeof(s));//清空
memset(ne,0,sizeof(ne));
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s[i]=i-1;
ne[i]=i+1;
b[i]=a[i];
}
ne[0]=1;
s[n+1]=n;
long long sum=0;
for(int i=1;i<=n;i++)
{
for(int j=ne[0];j<=i;j=ne[j])
{
b[j]=__gcd(b[j],a[i]);
sum=max(sum,b[j]*(i-s[j]));
if(b[j]==b[s[j]])
{
ne[s[s[j]]]=j;
s[j]=s[s[j]];
}
}
}
cout<<sum<<endl;
}
return 0;
}