[BZOJ4052][Cerc2013]Magical GCD

[BZOJ4052][Cerc2013]Magical GCD

试题描述

给出一个长度在 100 000 以内的正整数序列,大小不超过 10^12。 
求一个连续子序列,使得在所有的连续子序列中,它们的GCD值乘以它们的长度最大。

输入

本题为多组数据。

第一行一个整数 T,表示数据组数。

每组数据第一行为一个整数 n,表示序列长度;第二行为 n 个整数表示序列。

输出

对于每组数据,输出 max{ gcd * length }

输入示例

1
5
30 60 20 20 20

输出示例

80

数据规模及约定

见“试题描述

题解

可以发现,随着子序列的增长,gcd 要么不变,若变化则变化后的 gcd 不会超过原来的 1/2,所以 gcd 的变化次数不会超过 log21012 = 12 · log210 次。

有了上面的结论,我们就可以枚举左端点,然后向右二分 gcd 即将变化的位置(维护区间 gcd 可以用 ST 表),在每个这样的位置更新答案,然后移动子序列右端点,重复这个过程。设数字大小为 A,那么更新答案次数为 log2A;每次二分需要 log2n;哦对了虽然 RMQ 询问复杂度 O(1),但是每次需要取 gcd,最坏情况 log2A;别忘了我们还枚举了左端点有一个 n,所以最终复杂度不会超过 O(n · log22A · log2n)。

大视野数据好强!我就因为少加 "mark!!" 那一行导致 WA 了一上午。。。

posted @   xjr01  阅读(389)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示