原题链接
部分参考自:https://www.acwing.com/solution/acwing/content/4795/
模型:把n拆成若干个正整数的方案数。
拆分时顺序是无所谓的。
n=2+1+1=1+2+1 为一种方案
4=4=3+1=2+2=2+1+1=1+1+1+1 一共五种方案
整数划分问题
缩小n的范围。1<=n<=1000
整数划分
方法一:完全背包
把1~n看作n个物品,每个物品的体积为1,问:装满背包的情况下方案数是多少。

方法二:换一种状态表示 f[i][j]:总和为j,一共有i个数

答案:f[n][1]+f[n][2]+f[n][3]+…+f[n][n]
前两种做法的时间复杂度都为:O(n2)
在 跑步 一题中只可以获得部分分。
做法 优化 母函数+五边形数定理
五边形数定理

设划分整数i的方案为pi。得到数列{pn}。
生成函数:f(x)=p0+p1x1+p2x2+...+pnxn(0≤x≤1)
显然p0=1
令f(x)=(1+x1+x2+...)(1+x2+x4+...)(1+x3+x6+..)...
即:f(x)=((x1)0+(x1)1+(x1)2+...)((x2)0+(x2)1+(x2)2+...)((x3)0+(x3)1+(x3)2+...)...
((x1)0+(x1)1+(x1)2+...):选出几个1
((x2)0+(x2)1+(x2)2+...):选出几个2
((x3)0+(x3)1+(x3)2+...):选出几个3
……
(1代表不选择)
例子:
样例1:
4=4 即 x4=1×1×1×x4=(x1)0(x2)0(x3)0(x4)1
4=1+3 即 x4=x1×1×x3=(x1)1(x2)0(x3)1
4=2+2 即 x4=1×x4=(x1)0(x2)2
4=1+1+2 即 x4=x2×x2=(x1)2(x2)1
4=1+1+1+1 即 x4=x2=(x1)4
即:问题转化为求生成函数所有括号乘积组合出的xn的情况数。
利用等比数列求和求解:
(1+x1+x2+...)=x−1x∞−1=1−x1
(1+x2+x4+...)=x2−1x∞−1=1−x21
……
所以f(x)=1−x11−x211−x31……=(1−x)(1−x2)(1−x3)……1
利用五边形数定理:
f(x)=1−x−x2+x5+x7−x12−x15+...1
f(x)=p0+p1x1+p2x2+...+pnxn=1−x−x2+x5+x7−x12−x15+...1
(p0+p1x1+p2x2+...+pnxn)(1−x−x2+x5+x7−x12−x15+...)=1
显然p0=1,所以除了常数项以外,每个项的系数都为零。
pnxn−pn−1xn−1x−pn−2xn−2x2+pn−5xn−5x5+pn−7xn−7x7−pn−12x12−pn−15x15+...=0
pn−pn−1−pn−2+pn−5+pn−7−pn−12−pn−15+...=0
pn=pn−1+pn−2−pn−5−pn−7+pn−12+pn−15−...
由五边形数定理得,n所减去的数列1,2,5,7,12,15,…可表达为23k2±k
代码:
