您的位置:首页 > 其它

BZOJ 4052: [Cerc2013]Magical GCD

2015-10-22 00:09 537 查看
以一个数字开头的子序列的gcd种类不会超过logn种,因此去找相同gcd最长的位置,更新一下答案,复杂度O(nlogn^2)

#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 300010
using namespace std;
int n,i,Log
,j,l,left,right,mid;
long long s
[20],ans;
long long gcd(long long a,long long b)
{
if (b==0) return a;
return gcd(b,a%b);
}
long long Q(int l,int r)
{
int k=Log[r-l+1];
return gcd(s[l][k],s[r-(1<<k)+1][k]);
}
int main()
{
int test;
scanf("%d",&test);
while (test--)
{
ans=0;
scanf("%d",&n);
for (i=1;i<=n;i++)
scanf("%lld",&s[i][0]);
for (i=1;i<=n;i++)
Log[i]=log2(i);
for (i=n;i>=1;i--)
for (j=1;j<=Log
;j++)
s[i][j]=gcd(s[i][j-1],s[i+(1<<(j-1))][j-1]);

for (i=1;i<=n;i++)
{
l=i;
while (l<=n)
{
left=l;
right=n;
while (left<=right)
{
mid=(left+right)>>1;
if (Q(i,mid)==Q(i,l))
left=mid+1;
else
right=mid-1;
}
l=right+1;
ans=max(ans,(right-i+1)*Q(i,right));
}
}
printf("%lld\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: