五邊形數與拆分數

2021-08-19 16:21:20 字數 2352 閱讀 6448

拆分數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...