前言
五边形数定理在GDOI2018d3t4中被作为考点,虽然这道题作为一道防AK题并没有人AC,但仍然引起了一波GD选手学习五边形数定理的热潮。作为一个热衷于追随潮流的菜鸡,我当然也要跑过来学习一发啦。
整数划分问题
整数划分问题指的是,给一个正整数 n n n,问把 n n n划分为若干个正整数和的形式有多少种不同的方案。
其中又分为选出的正整数可以相等和不能相等两个问题。
不能相等的整数划分问题
不难发现选出的数的数量一定不超过 O ( n ) O(\sqrt n) O(n)个,那么考虑 d p dp dp,设 f i , j f_{i,j} fi,j表示选了 i i i个数,和为 j j j的方案,枚举最小值是否为 1 1 1不难得出递推式 f i , j = f i , j − i + f i − 1 , j − i f_{i,j}=f_{i,j-i}+f_{i-1,j-i} fi,j=fi,j−i+fi−1,j−i
这样做的时间复杂度是 O ( n n ) O(n\sqrt n) O(nn)且可以支持多组询问,那么问题就基本被解决了。
可以相等的整数划分问题
我们可以设置一个阈值 B B B,对所有 1 ≤ x ≤ B 1\le x\le B 1≤x≤B的 x x x,我们对这部分进行背包,时间复杂度为 O ( n B ) O(nB) O(nB)。
对于所有 B < x ≤ n B<x\le n B<x≤n的 x x x,不难发现选择的数的数量不会超过 n B \frac{n}{B} Bn,那么可以用类似不能相等的整数划分问题的解决方法来做,时间复杂度为 O ( n 2 B ) O(\frac{n^2}{B}) O(Bn2