组合数问题 社论
题面
组合数问题
给 \(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\) 的方案数,则
注意到每次的转移矩阵是相同的,于是矩阵快速幂优化即可,时间复杂度 \(\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}\),则:
这样我们就得到了一个关于 \(A\) 的递推,类似的,矩阵快速幂优化即可,时间复杂度 \(\Theta(k^3\log n)\) .
这个 \(A\) 的式子和组合意义 DP 做法的很不相同,为什么是等价的呢?
这里没考虑 \(k=0\),考虑了就得取模,就和组合意义做法一样了 .
似乎魔怔的做法
根据题目背景我们可以把原式变成
下面的做法都是基于它的 .
循环卷积快速幂
组合数 /cf
\(\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 .
以下是博客签名,正文无关
本文来自博客园,作者:Jijidawang,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16621510.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ