码迷,mamicode.com
首页 > 其他好文 > 详细

hihoCoder #1246 王胖浩与环

时间:2018-02-03 16:00:22      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:最大   一个   复杂度   class   blog   题目   序列   lock   post   

题目大意

$n$($1\le n\le 2000$)个正整数 $a_1, a_2, \dots, a_n$($a_i\le 5\times 10^7$)分布在一个圆环上。
定义 $b_k$ 为:将环上的数划分成 $k$ 段,每段上的数之和的 GCD 的最大值。
求 $b_1, b_2, \dots, b_n$ 。

解法

首先,不难看出, $a_k$ 是 $n$ 个数之和 (记做 $S$)的约数。
考虑到 $S$ 的约数并不多($\sqrt{n}$ 是很松的上界,并且往往 $n$ 越大这上界越松),从而可以考虑枚举 $S$ 的约数 $d$,问题转化为

这 $n$ 个数最多能分成几段,使得每段数之和都能被 $d$ 整除。

算法一

枚举分段的起始位置 $i$,以 $i$ 为序列起点求前缀和,看前缀和中有几个能被 $d$ 整除。
复杂度 $O(n^2)$

算法二

不必枚举分段的起点。
直接对输入序列求前缀和。
按模 $d$ 的余数将 $n$ 个前缀和分类。
最大的类的 size 即为所求。

复杂度 $O(n\log n)$

这个做法应该是老套路了,我却不知道,我太菜了。TAT

hihoCoder #1246 王胖浩与环

标签:最大   一个   复杂度   class   blog   题目   序列   lock   post   

原文地址:https://www.cnblogs.com/Patt/p/8408956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!