考虑推式子。有转移:
pi=pi−1+(j=1∑i−1pimodpj)+(j=1∑i−1pjmodpi)
其中:
j=1∑i−1pjmodpi
可以考虑枚举 pj∈[kpi,(k+1)pi) 区间,求个和然后计数答案,因为 pi 互不相同,所以要枚举的数的数目最多是调和级数级别的,所以维护两个单点加区间求和的 ds 如 BIT 做就行了。
==j=1∑i−1pimodpjj=1∑i−1(pi−⌊pjpi⌋×pj)(j=1∑i−1pi)−(j=1∑i−1⌊pjpi⌋×pj)
其中蓝色部分 j=1∑i−1pi 直接算就行,而橙色部分左侧的 ⌊pjpi⌋ 只有不超过 ⌊pjpi⌋ 个不同取值,又因为 p1,p2,p3,…,pn 的值两两不同,因此总不同取值数量是调和级数级别的。此时直接按坐标的值暴力处理,然后要求一段区间内已经被加入的元素的和。单点加区间求和考虑 BIT 维护,于是做完了,时间复杂度为 O(nlog2n) 可以通过。
代码。
喜欢的话,留下你的评论吧~