2 条题解

  • 0
    @ 2026-9-1 21:01:26

    注意到对于任意元素,以他为左端点的区间的不同的 gcd 不超过 4040 个。且单调递减。

    所以直接 st 表预处理加上二分每一个会出现的 gcd 的最远位置即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=1e5+10;
    int st[N][20],a[N];
    int get(int l,int r)
    {
    	int k=log2(r-l+1);
    	return __gcd(st[l][k],st[r-(1<<k)+1][k]);
    }
    signed main()
    {
    	int n;cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<=n;i++)st[i][0]=a[i];
    	for(int i=1;i<=19;i++)for(int j=1;j+(1<<i)-1<=n;j++)
    		st[j][i]=__gcd(st[j][i-1],st[j+(1<<(i-1))][i-1]);
    	int ans=0;
    	for(int i=1;i<=n;i++)
    	{
    		int j=i;
    		while(j<=n)
    		{
    			int p=get(i,j);
    			int l=j,r=n,res=j;
    			while(l<=r)
    			{
    				int mid=(l+r)>>1;
    				if(get(i,mid)==p)l=mid+1,res=mid;
    				else r=mid-1;
    			}
    			ans=max(ans,p*(res-i+1));
    			j=res+1;
    		}
    	}
    	cout<<ans;
    	return 0;
    }

    信息

    ID
    6153
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者