[學習筆記]整數劃分數
阿新 • • 發佈:2019-02-18
sum 分享 src 完全 n) 前綴 完全背包 整數 -i
定義
P(i)把i劃分成若幹個整數的和的方案數。方案數不同當且僅當所用整數排序後不對應相同(存在某個整數用的次數不同)
求法
都是求前n項的每一項
完全背包
O(n^2)
分塊背包
根據物品大小分塊
小於根號n的只有n種:
f(i,j)前i個,j大小
f(i,j)<-f(i-1,j-sz[i]*k)
後面枚舉k用一個前綴和優化
O(nsqrt(n))
大於根號n的最多用根號n個
f(i,j)用了i個,j大小
f(i,j)->f(i+1,j+sqrt(n))
或者集體加1
f(i,j)->f(i,j+i)
道理是,初始認為是sqrt的,增長要靠集體加1,由於是“集體”所以必須操作有先後順序,使得每個方案都恰好會被枚舉到一次
O(nsqrt(n))
把第一維i都去掉(第一個直接去,第二個做前綴和)然後卷積一下即可。
生成函數
五邊形數和整數拆分數
遞推整數拆分數方法:
$F(x)\Pi_i(1-x^i)=1$
$F(x)(\sum a_ix^i)=1$
$(\sum a_i f_{n-i} x^i)=1$
觀察第n項系數:(第n項系數等式右邊是0)
$[x^n]f_n\sum_{i=1}^{n-1} a_i f_{n-i} =0$
再對比五邊形數:
$\Pi_i(1-x^i)=(\sum a_ix^i)=\sum_k (-1)^kx^\frac{k(3k+1)}{2}$
由於k也可以為負數,所以,只有當$i=\frac{k(3k+1)}{2}$或者$\frac{k(3k-1)}{2}$時才會有值
求出ai,大概是$O(sqrt(n))$級別的,然後就得到了$O(sqrt(n))$遞推式子
(為啥是五邊形數就不知道了。。。)
應用
Polya定理一些題,為了搞輪換會用到(一般就是dfs爆搜)
[學習筆記]整數劃分數