题面
组合数问题
给 n,p,k,r,求
∞∑i=0(nkik+r)
对 p 取模的结果 .
1≤n≤109,0≤r<k≤50,2≤p≤230−1 .
基于矩阵快速幂的做法
基本做法都是 O(k3logn) 的,值得一提的是,UM 给出了一个 O(k2logn) 做法 .
组合意义天地灭
这个是洛谷题解区比较普遍的算法,不知道为啥,难道是遇到数数组合题就先 DP 嘛?下面说一下天地灭的做法 .
考虑原式的组合意义,其实就是在 nk 个物品中选出 c 个使得 cmodk=r .
令 dpi,j 表示选到第 i 个,且选的物品数 c 满足 cmodk=r 的方案数,则
dpi,j=dpi−1,(j−1)modr+dpi−1,j
注意到每次的转移矩阵是相同的,于是矩阵快速幂优化即可,时间复杂度 Θ(k3logn) .
代数推导保平安
根据众所周知的 (nm)=(n−1m−1)+(n−1m) 对组合数作 k 次展开可以得到:
Lemma
(nm)=k∑i=0(n−km−i)(ki)
其中 k 为任意整数 .
令 An,r=∞∑i=0(nkik+r),则:
An,r=∞∑i=0(nkik+r)=∞∑i=0k∑j=0((n−1)kik+r−j)(kj)=k∑j=0∞∑i=0((n−1)kik+r−j)(kj)=k∑j=0(kj)∞∑i=0((n−1)kik+r−j)=k∑j=0(kj)An−1,r−j
这样我们就得到了一个关于 A 的递推,类似的,矩阵快速幂优化即可,时间复杂度 Θ(k3logn) .
这个 A 的式子和组合意义 DP 做法的很不相同,为什么是等价的呢?
An,k=k∑j=0(kj)An−1,r−j=k∑j=0((k−1j)+(k−1j−1))An−1,r−j=k∑j=0(k−1j)An−1,r−j+k−1∑j=0(k−1j−1)An−1,(r−1)−(j−1)=An−1,k+An−1,k−1
这里没考虑 k=0,考虑了就得取模,就和组合意义做法一样了 .
似乎魔怔的做法
根据题目背景我们可以把原式变成
∑imodk=r(nki)
下面的做法都是基于它的 .
循环卷积快速幂
组合数 /cf
ans=∑imodk=r(nki)=∑imodk=r[zi](1+z)nk=[zr]((1−z)nkmod(zk−1))
mod(zk−1) 相当于卷积 to 循环卷积,这样循环卷积快速幂即可 O(k2(logn+logk)) .
kls 给出了一种去掉 logk 的方法:首先 O(1−z)nk=((1−z)k)n),注意到 k≤50,且 (5025)=126410606437752 不会超过 64 位有符号整形表示范围,于是 O(k2) 算一下组合数然后循环卷积快速幂即可 O(k2logn) .
单位根反演
有取模就有单位根反演。
有一份 wangrx 的提交记录 洛谷 R66265722,手推没推出来 TAT .
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】