组合数问题 社论

题面

组合数问题

\(n,p,k,r\),求

\[\sum_{i=0}^{\infty}\dbinom{nk}{ik+r} \]

\(p\) 取模的结果 .

\(1 \leq n \leq 10^9\),$ 0 \leq r < k \leq 50$,\(2 \leq p \leq 2^{30} - 1\) .

基于矩阵快速幂的做法

基本做法都是 \(O(k^3\log n)\) 的,值得一提的是,UM 给出了一个 \(O(k^2\log n)\) 做法 .

组合意义天地灭

这个是洛谷题解区比较普遍的算法,不知道为啥,难道是遇到数数组合题就先 DP 嘛?下面说一下天地灭的做法 .

考虑原式的组合意义,其实就是在 \(nk\) 个物品中选出 \(c\) 个使得 \(c\bmod k = r\) .

\(dp_{i,j}\) 表示选到第 \(i\) 个,且选的物品数 \(c\) 满足 \(c\bmod k=r\) 的方案数,则

\[dp_{i,j}=dp_{i-1,(j-1)\bmod r}+dp_{i-1,j} \]

注意到每次的转移矩阵是相同的,于是矩阵快速幂优化即可,时间复杂度 \(\Theta(k^3\log n)\) .

代数推导保平安

根据众所周知的 \(\dbinom nm=\dbinom{n-1}{m-1}+\dbinom{n-1}m\) 对组合数作 \(k\) 次展开可以得到:

Lemma

\[\dbinom nm=\sum_{i=0}^k\dbinom{n-k}{m-i}\dbinom ki \]

其中 \(k\) 为任意整数 .

\(\displaystyle A_{n,r}=\sum_{i=0}^{\infty}\dbinom{nk}{ik+r}\),则:

\[\begin{aligned}A_{n,r}&=\sum_{i=0}^{\infty}\dbinom{nk}{ik+r}\\&=\sum_{i=0}^{\infty}\sum_{j=0}^k\dbinom{(n-1)k}{ik+r-j}\dbinom kj\\&=\sum_{j=0}^k\sum_{i=0}^{\infty}\dbinom{(n-1)k}{ik+r-j}\dbinom kj\\&=\sum_{j=0}^k\dbinom kj\sum_{i=0}^{\infty}\dbinom{(n-1)k}{ik+r-j}\\&=\sum_{j=0}^k\dbinom kjA_{n-1,r-j}\end{aligned} \]

这样我们就得到了一个关于 \(A\) 的递推,类似的,矩阵快速幂优化即可,时间复杂度 \(\Theta(k^3\log n)\) .


这个 \(A\) 的式子和组合意义 DP 做法的很不相同,为什么是等价的呢?

\[\begin{aligned}A_{n,k}&=\sum_{j=0}^k\dbinom kjA_{n-1,r-j}\\&=\sum_{j=0}^k\left(\dbinom{k-1}j+\dbinom{k-1}{j-1}\right)A_{n-1,r-j}\\&=\sum_{j=0}^k\dbinom{k-1}jA_{n-1,r-j}+\sum_{j=0}^{k-1}\dbinom{k-1}{j-1}A_{n-1,(r-1)-(j-1)}\\&=A_{n-1,k}+A_{n-1,k-1}\end{aligned} \]

这里没考虑 \(k=0\),考虑了就得取模,就和组合意义做法一样了 .

似乎魔怔的做法

根据题目背景我们可以把原式变成

\[\sum_{i\bmod k=r}\dbinom{nk}{i} \]

下面的做法都是基于它的 .

循环卷积快速幂

组合数 /cf

\[\begin{aligned}ans&=\sum_{i\bmod k=r}\dbinom{nk}{i}\\&=\sum_{i\bmod k=r}[z^i](1+z)^{nk}\\&=[z^r]((1-z)^{nk}\bmod (z^k-1))\end{aligned} \]

\(\bmod(z^k-1)\) 相当于卷积 to 循环卷积,这样循环卷积快速幂即可 \(O(k^2(\log n+\log k))\) .

kls 给出了一种去掉 \(\log k\) 的方法:首先 \(O(1-z)^{nk}=((1-z)^k)^n)\),注意到 \(k\le 50\),且 \(\dbinom{50}{25}=126410606437752\) 不会超过 64 位有符号整形表示范围,于是 \(O(k^2)\) 算一下组合数然后循环卷积快速幂即可 \(O(k^2\log n)\) .

单位根反演

有取模就有单位根反演。

有一份 wangrx 的提交记录 洛谷 R66265722,手推没推出来 TAT .

posted @ 2022-08-24 20:42  Jijidawang  阅读(117)  评论(1编辑  收藏  举报
😅​