1. 程式人生 > >[學習筆記]整數劃分數

[學習筆記]整數劃分數

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爆搜)

[學習筆記]整數劃分數