组合数问题 社论

题面

组合数问题

n,p,k,r,求

i=0(nkik+r)

p 取模的结果 .

1n1090r<k502p2301 .

基于矩阵快速幂的做法

基本做法都是 O(k3logn) 的,值得一提的是,UM 给出了一个 O(k2logn) 做法 .

组合意义天地灭

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

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

dpi,j 表示选到第 i 个,且选的物品数 c 满足 cmodk=r 的方案数,则

dpi,j=dpi1,(j1)modr+dpi1,j

注意到每次的转移矩阵是相同的,于是矩阵快速幂优化即可,时间复杂度 Θ(k3logn) .

代数推导保平安

根据众所周知的 (nm)=(n1m1)+(n1m) 对组合数作 k 次展开可以得到:

Lemma

(nm)=i=0k(nkmi)(ki)

其中 k 为任意整数 .

An,r=i=0(nkik+r),则:

An,r=i=0(nkik+r)=i=0j=0k((n1)kik+rj)(kj)=j=0ki=0((n1)kik+rj)(kj)=j=0k(kj)i=0((n1)kik+rj)=j=0k(kj)An1,rj

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


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

An,k=j=0k(kj)An1,rj=j=0k((k1j)+(k1j1))An1,rj=j=0k(k1j)An1,rj+j=0k1(k1j1)An1,(r1)(j1)=An1,k+An1,k1

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

似乎魔怔的做法

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

imodk=r(nki)

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

循环卷积快速幂

组合数 /cf

ans=imodk=r(nki)=imodk=r[zi](1+z)nk=[zr]((1z)nkmod(zk1))

mod(zk1) 相当于卷积 to 循环卷积,这样循环卷积快速幂即可 O(k2(logn+logk)) .

kls 给出了一种去掉 logk 的方法:首先 O(1z)nk=((1z)k)n),注意到 k50,且 (5025)=126410606437752 不会超过 64 位有符号整形表示范围,于是 O(k2) 算一下组合数然后循环卷积快速幂即可 O(k2logn) .

单位根反演

有取模就有单位根反演。

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

posted @   yspm  阅读(123)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示