搜索最大公约数2(gcd)
WZH 最大公约数2(gcd)
一个环,第 i 个数字为 ai,求对于 k=1∼n ,求将环分为 k 端后,每一段数字和的 gcd 的最大值。
n≤2000,ai≤5×107 。
首先看到 gcd 和 max ,我们应该立马想到:枚举 gcd=g。
那么此时,对于一个 k,问题就变为了是否存在一种划分使得每一段都为 g 的倍数。
接下来,显然的,考虑前缀和。设 si=∑j=1iaj ,那么一段 [i+1,j] 的和为 g 的倍数,就变为 si≡sj(modg) 了。然后,由于是环,问题转变为是否存在 k 个数,使得他们的 s 模 g 同余。
这个问题如果直接枚举 g ,可以做到复杂度 O(n∑ai) ,可以获得 50% 的分数。
然后,一个关键观察: g∣sn 。
这样,我们只需要枚举 sn 的因数即可。由于 sn≤1011,d(sn)≤5×103,这样我们只需要枚举 5×103 个 g 就行。复杂度 O(nd(sn))。