拆分數p(n),就是將n拆分成正整數的和的方案數。
樸素的做法應該是可以做到時空o(
nn√)
一次詢問的,但多組詢問便毫無辦法。
但我們可以通過生成函式和正五邊形數的方法來做到o(
nn√)
預處理o(1)詢問
其實可以看wiki
注意這並不是數論中的尤拉函式 定義ϕ
(x)=
∏∞i=
1(1−
xi)
設拆分數的母函式p(
x),根據定義有p(
x)=∏
∞i=1
(1+x
i+x2
i+x3
i)..
. 也就是p(x
)=1∏
∞i=1
(1−x
i)所以ϕ(
x)p(
x)=1
但是知道了這一點還是很難做,於是我們需要乙個五邊形數定理ϕ(
x)=∑
i=−∞
∞(−1
)ixi
∗(3i
−1)2
=1+∑i=1
∞(−1
)ixi
∗(3i
±1)2
其中i∗
(3i±
1)2 這樣的數叫做廣義五邊形數,當取減號的時候代表能夠排成五邊形的多邊形的點數。
不懂的可以看
這裡我們可以發現五邊形數是o(n^2)級別的,也就是說我們用這個東西遞推的複雜度就是o(
nn√)
那麼怎麼證明呢?
如果覺得我講的不好的可以看這裡
考慮尤拉函式的第n項的係數代表的意義,就是把n拆成互不相同的偶數個正整數的方案數-把n拆成互不相同的奇數個正整數的方案數
考慮 n 的任意一種劃分的 ferrers 圖(就是wiki裡那種每一行小於上一行的圖)
比如n=20時的一種:
0 0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0
0 0 0
設m為最下面一行的元素個數,s為最上面斜對角線的元素個數(這張圖里m=3,s=2)
那麼我們定義一種變換:
1』當m>s時,將這s個元素放到最後一行
例子中的圖會變成
0 0 0 0 0 0
0 0 0 0 0
0 0 0 0
0 0 0
0 0
2』當m<=s時,將這m個元素依次放到前s行每一行的末尾
二次操作後的例子會變成
0 0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0
0 0 0
觀察可以發現,這種變換會得到n的一種奇偶性不同的拆分,並且進行兩次這種操作之後的圖會變回原來的樣子,也就是這種操作是可逆的。
那麼我們可以發現,每一種偶數劃分方案都唯一對應另一種奇數劃分方案。
也就是x^n的係數本來應該為0才對,不過有些位置有值?
我們會發現上述的規律對於大多數n都使用,除了少數的特例:
1)m=s+1且s那條線與最後一行相遇
0 0 0 0 0 0
0 0 0 0 0
0 0 0 0
嘗試操作之後我們得到
0 0 0 0 0
0 0 0 0
0 0 0
0 0 0
然而這樣是不合法的。
這個東西對係數的貢獻為(-1)^s
這樣子的點的個數n=
(s+1
)+(s
+2)+
..+(
2s)=
(3s+
1)s2
2)m=s且s那條線與最後一行相遇
0 0 0 0 0
0 0 0 0
0 0 0
嘗試操作之後我們會得到
0 0 0 0 0 0
0 0 0 0 0
0 奇偶性並沒有發生改變,而是變成了另乙個狀態
這樣對係數的貢獻也是(-1)^s 點數n
=s+(
s+1)
+(s+
2)+.
.+(2
s−1)
=(3s
−1)s
2 所以我們發現不合法的情況只有當n為某個廣義正五邊形數的時候會出現
而且這樣的係數恰好為(-1)^s,其他情況都會奇偶抵消,等於等式右邊。
q.e.d
五邊形數定理的一種證明
很久以前就知道五邊形數定理了 但是用它a過幾道題,一直不知道怎麼證明感覺很不痛快 qwq 最近在wiki上找到乙個簡單優雅的證明方法 在網上並沒有找到過中文的證明,所以把它粗略翻譯一下,放在這裡 qwq 五邊形數定理是乙個尤拉發現的數學定理,描述尤拉函式展開式的特性,尤拉函式展開式如下 x n 1 ...
五邊形數和兩個遞迴式
五邊形數是對每條邊上有 n 個點構成的五邊形的總點數的數列的稱呼。由上圖,可以得出這個數列的遞迴式。begin a 1 1 a n a 3n 2 end 解遞迴式得到通項公式 begin a n sum n 3i 2 frac end 它也能通過三個三角形數得到。狹義的五邊形數中 n 均為正整數,但...
五邊形lisp程式 CAD LISP 程式
1 10 1.計算所有線段總長度 載入後只需框選所有線段便可得出這些線段的總長度 defun c ll setvar cmdecho 1 setq en ssget list 0 spline,arc,line,ellipse,lwpolyline setq i 0 setq ll 0 repeat...