分拆数

· · 个人记录

分拆数

分拆数:从入门到放弃

本文用空心方格 \square 表示“证毕”

\textbf{Part 1:} 定义

分拆:将 n\in \mathbb{N} 写成单调不升的正整数的和。

n=r_1+r_2+r_3+\cdots+r_k\quad r_1\ge r_2\ge r_3\ge\cdots\ge r_k\ge 1

“单调不升”表示分拆是无序的

分拆数:n\in \mathbb{N} 的分拆方案数,记作 p_n。A000041

p_0 p_1 p_2 p_3 p_4 p_5 p_6 p_7 p_8
1 1 2 3 5 7 11 15 22

\textbf{Part 2:} Ferrers

一个 Ferrers 图是一个分拆的几何表示,是推导分拆数强有力的工具。

其中第 $i$ 行有 $r_i$ 个点。 例如 $9=4+2+2+1$ 的 Ferrers 图如下: ![Ferrers_9_4_2_2_1](https://cdn.luogu.com.cn/upload/image_hosting/ggdupc8j.png) 通过在 Ferrers 图上操作,我们能建立起分拆之间的对应关系 从而轻易推出分拆数的很多性质。 本文后面的推导中将用到 Ferrers 图,这里先介绍最重要的一个关系:**共轭**。 我们将一个分拆 $\lambda$ 的 Ferrers 图画出来, 然后按**从左上到右下的对角线翻转**,得到一张新的 Ferrers 图。 这个 Ferrers 图可以表示为一个新的分拆 $\lambda^*$。 我们称 n 的分拆 $\lambda$ 的**共轭分拆**是分拆 $\lambda^*$。 显然 $\lambda=(\lambda^*)^*$。 且 $\forall\lambda_1\neq\lambda_2$,都有 $\lambda^*_1\neq\lambda^*_2$。 $\therefore \lambda$ 和 $\lambda^*$ 是一一对应的。 例如 $9=4+2+2+1$ 的共轭分拆为 $9=4+3+1+1$。 ![Ferrers_9_4_3_1_1](https://cdn.luogu.com.cn/upload/image_hosting/75unqpv8.png) --- ## $\textbf{Part 3:}$ 各种限制的分拆数 ### 1. $k$ 部分拆数 $k$ 部分拆数:$n\in \mathbb{N}$ 恰好分拆成 $k$ 个正整数的方案数,记作 $p(n,k)$。 显然 $p_n=\sum\limits_{k=0}^{n}p(n,k)$。 我们考虑如何递推。 > 定理 3.1.1: > $$p(n,k)=\begin{cases}1&n=k=0\\p(n-1,k-1)+p(n-k,k)&1\le k\le n\\0&\text{otherwise.}\end{cases} \tag{3.1.1}$$ **证:** 考虑 $p(n,k)(1\le k\le n)$ 的一个分拆 $\lambda$。 $n=r_1+r_2+r_3+\cdots+r_k,\quad r_1\ge r_2\ge r_3\ge\cdots\ge r_k\ge 1$。 如果我们将每个 $r_i$ 减去 $1$,那么得到 $n-k=(r_1-1)+(r_2-1)+(r_3-1)+\cdots+(r_k-1)$。 如果此时 $r_i-1$ 中有 $j$ 个为 $0$,那么该方案会被统计在 $p(n-k,k-j)$ 中。 于是得:$p(n,k)=\sum\limits_{j=0}^{k}p(n-k,j)$。 $$\begin{aligned}p(n,k)-p(n-1,k-1)&=\sum\limits_{j=0}^{k}p(n-k,j)-\sum\limits_{j=0}^{k-1}p((n-1)-(k-1),j)\\&=\sum\limits_{j=0}^{k}p(n-k,j)-\sum\limits_{j=0}^{k-1}p(n-k,j)\\&=p(n-k,k)\end{aligned}$$ $$\therefore p(n,k)=p(n-1,k-1)+p(n-k,k)\quad \square$$ 至此,我们可以用 $\mathcal{O}(n^2)$ 的时间复杂度 求出 $[1,n]$ 的 分拆数 和 $k$ 部分拆数 了。 --- ### 2. 互异分拆数 互异分拆:将 $n\in \mathbb{N}$ 写成**严格单调递降**的正整数的和。 $n=r_1+r_2+r_3+\cdots+r_k\quad r_1> r_2> r_3>\cdots> r_k> 0$。 后面的定义与分拆类似。 $pd_n$:互异分拆数。[A000009](https://oeis.org/A000009) $pd(n,k)$:$k$ 部互异分拆数。 | $pd_0$ | $pd_1$ | $pd_2$ | $pd_3$ | $pd_4$ | $pd_5$ | $pd_6$ | $pd_7$ | $pd_8$ | |:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:| | $1$ | $1$ | $1$ | $2$ | $2$ | $3$ | $4$ | $5$ | $6$ | > 定理 3.2.1 > $$pd(n,k)=\begin{cases}1&n=k=0\\pd(n-k,k-1)+pd(n-k,k)& 1\le k<\sqrt{2n}\\0&\text{otherwise.}\end{cases} \tag{3.2.1}$$ **证:** 与 定理 3.1.1 的证明同理。 不过因为 $r_i$ 互不相同,所以 $j$ 至多为 $1$。 所以直接得到 $pd(n,k)=pd(n-k,k-1)+pd(n-k,k)$。 注意到 $2$ 式的限制:$1\le k<\sqrt{2n}

我们尝试将 n 拆出尽可能多的数,显然为 1,2,3,\dots,k

此时 n=\sum\limits_{i=1}^{k}i=\dfrac{k(k+1)}{2}>\dfrac{k^2}{2}

所以对于 $n\in \mathbb{N}_+$,$pd(n,k)$ 非 $0$ 的 $k$ 不到 $\sqrt{2n}$ 个。 我们可以用 $\mathcal{O}(n\sqrt{n})$ 的时间复杂度 求出 $[1,n]$ 的 互异分拆数 和 $k$ 部互异分拆数 了。 --- ### 3. 最大部分为 $m$ 的分拆数 定义 $p^{max}(n,m)$ 为 最大部分为 $m$ 的分拆的方案数 类似的,定义 $pd^{max}(n,m)$ 为 最大部分为 $m$ 的互异分拆的方案数 > 定理 3.3.1: > $$p^{max}(n,m)=p(n,m)$$ > $$pd^{max}(n,m)=pd(n,m)\tag{3.3.1}$$ **证:** 考虑 $p^{max}(n,k)$ 的一个分拆 $\lambda$ 的 Ferrers 图,显然它有 $k$ 列。 我们发现其共轭分拆 $\lambda^*$ 有 $k$ 行,正好被 $p(n,k)$ 统计一次。 因为 $\lambda$ 和 $\lambda^*$ 一一对应,所以 $p^{max}(n,m)=p(n,m)$。 $pd$ 同理 $\ \square$。 这是利用 Ferrers 图证明分拆数的模板,**通过建立一一对应的关系来证明分拆数的相等关系** --- ### 4. (互异)奇/偶分拆数 奇分拆数:$po_n$ 表示将 $n\in \mathbb{N}$ 拆成**每个部分为奇数**的分拆的方案数。[A000009](https://oeis.org/A000009) 偶分拆数:$pe_n$ 表示将 $n\in \mathbb{N}$ 拆成**每个部分为偶数**的分拆的方案数。 互异奇分拆数:$pdo_n$ 表示将 $n\in \mathbb{N}$ 拆成**每个部分为奇数**的互异分拆的方案数。[A000700](https://oeis.org/A000700) 互异偶分拆数:$pde_n$ 表示将 $n\in \mathbb{N}$ 拆成**每个部分为偶数**的互异分拆的方案数。 --- 对于(互异)偶拆分数,我们显然有: $$pe_n=\begin{cases}p_{\frac{n}{2}}& n\equiv 0\pmod{2}\\0& \text{else}\end{cases}$$ $$pde_n=\begin{cases}pd_{\frac{n}{2}}& n\equiv 0\pmod{2}\\0& \text{else}\end{cases}$$ 所以(互异)偶拆分数没什么用,这里只是为了定义的对称。 > 定理 3.4.1: > $$po_n=pd_n\tag{3.4.1}$$ **证:** 尝试构造一一对应的关系。 我们考虑一个互异分拆,如果它已经是奇分拆那我们不考虑 反之一定 $\exists i,r_i=2k$。 那么我们将 $r_i$ 平分为两个 $k$。 经过若干次操作后一定不存在 $r_i$ 是偶数。 这样我们就将一个互异分拆**单射**到一个奇分拆。 > 这里满足单射,是因为一个互异分拆至少操作一次后就不满足“互异”的条件了。 > > 换句话说,**不存在**两个不同的互异分拆经过若干次操作变成同一个奇分拆。 > > 在其它构造证明中我们也要注意这点 注意到操作可逆,于是可以将任意一个奇分拆单射到一个互异分拆。 这样我们就建立了一一对应的关系。 于是 $po_n=pd_n\quad \square$。 --- ### 5. (互异)奇/偶**部**拆分数 奇部分拆数:$p^o_n$ 表示将 $n\in \mathbb{N}$ 拆成**奇数个部分**的分拆的方案数。 偶部分拆数:$p^e_n$ 表示将 $n\in \mathbb{N}$ 拆成**偶数个部分**的分拆的方案数。 类似的,还有 互异奇部分拆数:$pd^o_n$ 表示将 $n\in \mathbb{N}$ 拆成**奇数个部分**的互异分拆的方案数。 互异偶部分拆数:$pd^e_n$ 表示将 $n\in \mathbb{N}$ 拆成**偶数个部分**的互异分拆的方案数。 显然有 $$p^o_n+p^e_n=p_n$$ $$pd^o_n+pd^e_n=pd_n$$ 注意 奇/偶分拆数($po/pe$)和 奇/偶部分拆数($p^o/p^e$)是两个完全不同的概念。 --- ### 6. 自共轭分拆数 自共轭分拆:共轭分拆与本身相同的分拆。 ![Ferrers_13_5_3_3_1_1](https://cdn.luogu.com.cn/upload/image_hosting/f6z04mww.png) 自共轭分拆数:$ps_n$ 表示 表示将 $n\in \mathbb{N}$ 的自共轭分拆的方案数。[A000700](https://oeis.org/A000700) > 定理 3.6.1: > $$pdo_n=ps_n\tag{3.6.1}$$ **证:** 还是尝试构造一一对应的关系。 考虑一个自共轭分拆。 我们将这个分拆从左上到右下分层。 如下图所示: ![Ferrers_13_5_3_3_1_1_split](https://cdn.luogu.com.cn/upload/image_hosting/mkfnihsp.png) 显然每一“块”有奇数个点,且外层的块大于内层的块。 于是我们将其重新按每一块拆分开,如下图: ![Ferrers_13_9_3_1_split](https://cdn.luogu.com.cn/upload/image_hosting/2rpaayg2.png) 这样我们就得到了一个互异奇分拆。 和前面的证明类似,因为操作可逆,所以我们能建立一一对应的关系,从而证明 $pdo_n=ps_n\quad \square$。 --- ## $\textbf{Part 4:}$ 生成函数 ### 1. 分拆数 $\textbf{Part 3}$ 的推导比较纯数学。 这里换个角度思考,分拆数其实是个完全背包板子。 ```cpp F[0]=1; for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) F[j]+=F[j-i]; ``` 时间复杂度 $\mathcal{O}(n^2)$。 > 定理 4.1.1:分拆数 $p$ 的生成函数: > $$F_p(x)=\prod\limits_{i=1}^{+\infty}\dfrac{1}{1-x^i} \tag{4.1.1}$$ **证:** 背包可以看作 $n$ 个多项式相乘,`F[i]` 表示 $x^i$ 的系数。 又 $\because \sum\limits_{i=0}^{+\infty}x^k=1+x^k+x^{2k}+x^{3k}+\cdots=\dfrac{1}{1-x^k}

于是我们能据此写出分拆数的生成函数

\begin{aligned}F_p(x)&=\sum\limits_{i=0}^{+\infty}p_ix^i\\&=1(1+x+x^2+x^3+\cdots)(1+x^2+x^4+x^6+\cdots)(1+x^3+x^6+x^9+\cdots)\cdots\\&=\prod\limits_{i=1}^{+\infty}\frac{1}{1-x^i}\quad \square\end{aligned}

其实不用背包,这个式子也很好理解。

如果实在搞不懂,出门左转搜“生成函数”。

ps: 背包求 k 部分拆数\mathcal{O}(n^3) 的,所以 定理3.1.1 还是要记的。

2. 互异分拆数

与分拆数类似,互异分拆数是 0/1背包。

定理 4.2.1:互异分拆数 pd 的生成函数:

F_{pd}(x)=\prod\limits_{i=1}^{+\infty}(1+x^i) \tag{4.2.1}

证: 类似 定理4.1.1 可得:

\begin{aligned}F_{pd}(x)&=\sum\limits_{i=0}^{+\infty}pd_ix^i\\&=1(1+x)(1+x^2)(1+x^3)\cdots\\&=\prod\limits_{i=1}^{+\infty}(1+x^i)\quad \square\end{aligned}

3. 奇分拆数

定理 4.3.1:奇分拆数 po 的生成函数:

F_{po}(x)=\prod\limits_{i=1}^{+\infty}\frac{1}{1-x^{2i-1}}=F_{pd}(x)\tag{4.3.1}

证:

\begin{aligned}F_{po}(x)&=1(1+x+x^2+x^3+\cdots)(1+x^3+x^6+\cdots)\cdots\\&=\prod\limits_{i=1}^{+\infty}\frac{1}{1-x^{2i-1}}\\&=\frac{1}{(1-x)(1-x^3)(1-x^5)\cdots}\\&=\frac{(1-x^2)(1-x^4)(1-x^6)\cdots}{(1-x)(1-x^1)(1-x^2)(1-x^3)\cdots}\\&=\frac{\prod\limits_{i=1}^{+\infty}(1-x^{2i})}{\prod\limits_{i=1}^{+\infty}(1-x^i)}\\&=\frac{\prod\limits_{i=1}^{+\infty}(1-x^{i})(1+x^i)}{\prod\limits_{i=1}^{+\infty}(1-x^i)}\\&=\prod\limits_{i=1}^{+\infty}(1+x^i)\quad \square\end{aligned}

\textbf{Part 5:} 优化

1.五边形数定理

五边形数(A000326)就是指下面这种数(图来自 StudyingFather)。

运用小学知识可知:

\begin{aligned}P_5(n)&=P_5(n-1)+3n-2\\&=\sum\limits_{i=1}^{n}(3i-2)\\&=3\frac{n(n+1)}{2}-2n\\&=\frac{3n^2+3n-4n}{2}\\&=\frac{n(3n-1)}{2}\end{aligned}

顺便说一嘴,\dfrac{n(n+1)}{2} 就是三角形数的通项公式,n^2 就是四边形数的通项公式(

广义五边形数(A001318)就是五边形数的公式扩展到 \mathbb{Z}

x 0 1 -1 2 -2 3 -3 4 -4
exP_5(x) 0 1 2 5 7 12 15 22 26

为了公式简洁,后文的 P_5(x) 都表示广义五边形数(即定义域为 \mathbb{Z})。

这里不深入探讨五边形数性质,仅使用其通项公式和上面这个数列。

定理 5.1.1:

pd^e_n=pd^o_n+\Delta_n\tag{5.1.1}

其中 \Delta_n 是误差项,如果 n=P_5(i) 时(即 n 是广义五边形数)值为 (-1)^i,否则为 0

证: 注意到 \Delta_n 非常小,我们还是尝试构造一一对应。

定理 5.1.2(五边形数定理):

\begin{aligned}\phi(x)&=\prod_{i=1}^{+\infty}(1-x^i)\\&=\sum\limits_{i=-\infty}^{+\infty}(-1)^{i}x^{P_{5}(i)}\end{aligned}\tag{5.1.2}

其中 \phi(x) 是欧拉函数(不是常见的互质的那个 \varphi(x)),该定理由欧拉首先完成推导。

证: 考虑第一行柿子的组合意义。

将其展开:(1-x^1)(1-x^2)(1-x^3)\cdots

每个括号中,要么选 1(相当于没选),要么选 -x^i

(-x^{r_1})(-x^{r_2})(-x^{r_3})\cdots(-x^{r_k})=(-1)^{k}x^{n}\quad n=\sum\limits_{i=1}^{k}r_i\quad r_1>r_2>r_3>\cdots>r_k>0

相当于为 x^n 贡献了一个 (-1)^k 的系数。

考虑 n 的互异分拆数,x^n 的系数为 (pd^e_n-pd^o_n)=\Delta_n(定理 5.1.1)。

所以 \phi(x)=\sum\limits_{i=0}^{+\infty}\Delta_{n}x^n=\sum\limits_{i=-\infty}^{+\infty}(-1)^{i}x^{P_{5}(i)}\quad \square

定理 5.1.3(分拆数的递归式):

\begin{aligned}p_n&=\sum\limits_{i>0 \And n\ge P_5(-i)}(-1)^{i+1}(p_{n-P_5(i)}+p_{n-P_5(-i)})\\&=p_{n-1}+p_{n-2}-p_{n-5}-p_{n-7}+p_{n-12}+p_{n-15}-\cdots\end{aligned}\tag{5.1.3}

证: 回顾分拆数的生成函数:F_p(x)=\prod\limits_{i=1}^{+\infty}\dfrac{1}{1-x^i}=\dfrac{1}{\phi(x)}

将其乘上一个 \phi(x) 得:

\begin{aligned} F_p(x)\phi(x)&=\frac{1}{\phi(x)}\phi(x)\\ &=(\sum\limits_{i=0}^{+\infty}p_ix^i)(\sum\limits_{i=-\infty}^{+\infty}(-1)^{i}x^{P_{5}(i)})\\ &=(p_0+p_1x^1+p_2x^2+p_3x^3+\cdots)(1-x^1-x^2+x^5+x^7-x^{12}-x^{15}+\cdots)\\ &=1\\ &=1+0x+0x^2+0x^3+\cdots \end{aligned}

考虑 x^n 的系数是怎么变成 0 的。

所以 $x^n$ 的系数为 $p_n-p_{n-1}-p_{n-2}+p_{n-5}+p_{n-7}-p_{n-12}-p_{n-15}+\cdots=0$。 移项得 $p_n=p_{n-1}+p_{n-2}-p_{n-5}-p_{n-7}+p_{n-12}+p_{n-15}-\cdots\quad \square$。 因为 $P_5(x)=\dfrac{x(3x-1)}{2}$ 是个二次函数。 所以 $n$ 以内的广义五边形数只有大约 $3\sqrt{n}$ 个。 所以我们可以用 $\mathcal{O}(n\sqrt{n})$ 的时间复杂度 求出 $[1,n]$ 的 分拆数。 ```cpp constexpr int Mod=998244353; static int p[100010]; int n; read(n); p[0]=1; for(int i=1;i<=n;i++){ int sign=1; for(int j=1,k;(k=j*(3*j-1)>>1)<=i;j<0?(j=-j+1,sign=-sign):j=-j){ p[i]+=p[i-k]*sign; if(p[i]>=Mod)p[i]-=Mod; else if(p[i]<0)p[i]+=Mod; } } ``` --- ### 2.根号分治 --- ### 3.多重背包计数 --- ## $\textbf{Part 6:}$ 练习 [P6189 [NOI Online #1 入门组] 跑步](https://www.luogu.com.cn/problem/P6189) [[ABC221H] Count Multiset](https://www.luogu.com.cn/problem/AT_abc221_h) [P5824 十二重计数法](https://www.luogu.com.cn/problem/P5824) [P4128 [SHOI2006] 有色图](https://www.luogu.com.cn/problem/P4128) ## $\textbf{Part 7:}$ 参考 [分拆数 - OI Wiki](https://oi-wiki.org/math/combinatorics/partition/) 《组合数学(原书第五版)》- [美] Richard A. Brualdi [多项式计数杂谈 - command_block 的博客 - 洛谷博客](https://www.luogu.com.cn/blog/command-block/sheng-cheng-han-shuo-za-tan) [分拆数的四种求法 - 木xx木大 的博客 - 洛谷博客](https://www.luogu.com.cn/blog/flyingfan/fen-chai-shuo-di-si-zhong-qiu-fa) [整数分拆中的一个出人意料的结论 | Matrix67: The Aha Moments](http://www.matrix67.com/blog/archives/6348) [五边形数定理的一种证明_欧拉五边形数定理-CSDN博客](https://blog.csdn.net/visit_world/article/details/52734860) [Euler's pentagonal number theorem and Dedekind eta function | Travor's Home Page](https://travorlzh.github.io/2023/03/19/euler-pentagonal-and-dedekind-eta.html)