注意到 ln 的增长率很慢,并且有下取整,所以直接对 ⌊Aln(n+B)+C⌋ 分个段做……(
首先解决一个简单的不等式问题:如何求每一段的端点?
设这一段为 [l,r],其中 l 已知,并令 W=⌊Aln(l+B)+C⌋。
那么 r 是最大的满足 ⌊Aln(n+B)+C⌋=W 的整数,换句话说可以看作最大的满足 ⌊Aln(n+B)+C⌋≤W 的整数。
即 Aln(n+B)+C<W+1。
即 n<expW−C+1A−B。
即 n=⌈expW−C+1A−B⌉−1。
考虑一个朴素的背包 DP:fi,j=fi−1,j+W(n)fi−1,j−1。
分了段之后,可知其相当于 fi,j=fi−1,j+Wnfi−1,j−1。
可证此时 fi.j 实际上是一个关于 i 的 2j 次多项式,于是拉格朗日插值即可(
复杂度 O(k3logn)(众所周知 A,B,C 都是常数)。
代码:
1 |
|