【模板】卢卡斯定理/Lucas 定理

题目链接:luogu P3807

题目大意

求 C(n,n+m)%p 的值。
p 保证是质数。

思路

Lucas 定理内容

对于非负整数 nnn,mmm,质数 ppp,有:
Cmn≡∏i=0kCmini(modp)C_m^n\equiv \prod\limits_{i=0}^kC_{m_i}^{n^i}(\bmod\ p)Cmn​≡i=0∏k​Cmi​ni​(mod p)
其中 m=mkpk+...+m1p+m0m=m_kp^k+...+m_1p+m_0m=mk​pk+...+m1​p+m0​,n=nkpk+...+n1p+n0n=n_kp^k+...+n_1p+n_0n=nk​pk+...+n1​p+n0​。(其实就是 n,mn,mn,m 的 ppp 进制展开)

那我们一般做题用的是递推式,也就是 Cmn≡C⌊m/p⌋⌊n/p⌋Cmmodpnmodp(modp)C_m^n\equiv C_{\left\lfloor m/p\right\rfloor}^{\left\lfloor n/p\right\rfloor}C_{m\bmod p}^{n\bmod p}(\bmod\ p)Cmn​≡C⌊m/p⌋⌊n/p⌋​Cmmodpnmodp​(mod p)
(当 n>mn>mn>m 时,我们规定 Cmn=0C_{m}^n=0Cmn​=0)

啥时候会用

我们有时候要算组合数,可能 CmnC_{m}^nCmn​ 的 n,mn,mn,m 很大,这时候一般做题就会让他取模一个数 modp\bmod \ pmod p。

那如果 p>mp>mp>m,我们可以愉快的用这个式子求:Cmn=m!n!(m−n)!C_{m}^n=\dfrac{m!}{n!(m-n)!}Cmn​=n!(m−n)!m!​
算出 n!n!n! 和 (m−n)!(m-n)!(m−n)! 的逆元,就可以搞。

可当 m⩾pm\geqslant pm⩾p 的时候,分母的乘法逆元可能不存在。(因为 xxx 是 ppp 的倍数的话 xxx 就没有模 ppp 的逆元)

那这个时候我们就可以用 Lucas 定理把这个组合数拆成几个 m<pm<pm<p 的,就可以搞了。

证明

证明 Lucas 定理之前,我们先证明两个式子。


式一:

Cpi≡piCp−1i−1≡0(modp),(1⩽i<p)C_p^i\equiv \frac{p}{i}C_{p-1}^{i-1}\equiv0(\bmod\ p),(1\leqslant i<p)Cpi​≡ip​Cp−1i−1​≡0(mod p),(1⩽i<p)
证明:
Cpi=p!i!(p−i)!=pi(p−1)!(i−1)!(p−1−(i−1))!=piCp−1i−1C_p^i=\dfrac{p!}{i!(p-i)!}=\dfrac{p}{i}\dfrac{(p-1)!}{(i-1)!(p-1-(i-1))!}=\frac{p}{i}C_{p-1}^{i-1}Cpi​=i!(p−i)!p!​=ip​(i−1)!(p−1−(i−1))!(p−1)!​=ip​Cp−1i−1​
由于 1⩽i<p1\leqslant i<p1⩽i<p,故 iii 会有 ppp 的逆元 inviinv_iinvi​
piCp−1i−1=p×invi×Cp−1i−1\frac{p}{i}C_{p-1}^{i-1}=p\times inv_i\times C_{p-1}^{i-1}ip​Cp−1i−1​=p×invi​×Cp−1i−1​
那这个地方都是 ppp 的倍数,那它被 ppp 取模一定是 000,故得证。


式二:

根据二项式定理:
(1+n)p≡Cp0+Cp1x+...+Cpp−1xp−1+Cppxp(modp)(1+n)^p\equiv C_p^0+C_p^1x+...+C_p^{p-1}x^{p-1}+C_p^px^p(\bmod\ p)(1+n)p≡Cp0​+Cp1​x+...+Cpp−1​xp−1+Cpp​xp(mod p)
再根据式一 Cpi≡0(modp),(1⩽i<p)C_p^i\equiv0(\bmod\ p),(1\leqslant i<p)Cpi​≡0(mod p),(1⩽i<p),可以得到
(1+n)p≡Cp0+Cppxp≡1+xp(modp)(1+n)^p\equiv C_p^0+C_p^px^p\equiv 1+x^p(\bmod\ p)(1+n)p≡Cp0​+Cpp​xp≡1+xp(mod p)


接着我们开始证明,先设 ⌊m/p⌋=qm,⌊n/p⌋=qn,mmodp=rm,nmodp=rn\left\lfloor m/p\right\rfloor=q_m,\left\lfloor n/p\right\rfloor=q_n,m\bmod p=r_m,n\bmod p=r_n⌊m/p⌋=qm​,⌊n/p⌋=qn​,mmodp=rm​,nmodp=rn​。
那有 m=qmp+rm,n=qnp+rnm=q_mp+r_m,n=q_np+r_nm=qm​p+rm​,n=qn​p+rn​。

接着我们继续用二项式定理:
(1+x)m=∑i=1mCmixi(1+x)^m=\sum\limits_{i=1}^{m}C_{m}^ix^i(1+x)m=i=1∑m​Cmi​xi
然后我们把左边给化简:
(1+x)m=(1+x)qmp+rm=(1+x)qmp⋅(1+x)rm=[(1+x)p]qm⋅(1+x)rm≡(1+xp)qm⋅(1+x)rm[式二]≡∑i=1qmCqmixip∑i=1rmCrmixi(modp)\begin{aligned}(1+x)^m & =(1+x)^{q_mp+r_m} \\ & =(1+x)^{q_mp}\cdot(1+x)^{r_m} \\& =[(1+x)^p]^{q_m}\cdot(1+x)^{r_m}\\&\equiv(1+x^p)^{q_m}\cdot(1+x)^{r_m}[式二]\\&\equiv\sum\limits_{i=1}^{q_m}C_{q_m}^ix^{ip}\sum\limits_{i=1}^{r_m}C_{r_m}^{i}x^i(\bmod\ p)\end{aligned}(1+x)m​=(1+x)qm​p+rm​=(1+x)qm​p⋅(1+x)rm​=[(1+x)p]qm​⋅(1+x)rm​≡(1+xp)qm​⋅(1+x)rm​[式二]≡i=1∑qm​​Cqm​i​xipi=1∑rm​​Crm​i​xi(mod p)​

那就有:
∑i=1mCmixi≡∑i=1qmCqmixip∑i=1rmCrmixi(modp)\sum\limits_{i=1}^{m}C_{m}^ix^i\equiv\sum\limits_{i=1}^{q_m}C_{q_m}^ix^{ip}\sum\limits_{i=1}^{r_m}C_{r_m}^{i}x^i(\bmod\ p)i=1∑m​Cmi​xi≡i=1∑qm​​Cqm​i​xipi=1∑rm​​Crm​i​xi(mod p)

那对于任意一个数 zzz,必然会有一组 i,ji,ji,j 满足 xz=xpixjx^z=x^{pi}x^jxz=xpixj
不难看出这其实就是满足 z=pi+jz=pi+jz=pi+j,所以当且仅当 i=⌊zp⌋,j=zmodpi=\left\lfloor \dfrac{z}{p}\right\rfloor,j=z\bmod pi=⌊pz​⌋,j=zmodp。
那也就是说左边的 iii 取任意一个,右边都有一个新的跟它对于恒等。
左边 i=xi=xi=x,右边的就分别是 i=⌊xp⌋,i=xmodpi=\left\lfloor \dfrac{x}{p}\right\rfloor,i=x\bmod pi=⌊px​⌋,i=xmodp

那当 i=xi=xi=x,就有:
Cmnxn=CqmqnxqnpCrmrnxrnCmnxn=CqmqnCrmrnxqnp+rnCmnxn=CqmqnCrmrnxn\begin{aligned}C_m^nx^n&=C_{q_m}^{q_n}x^{q_np}C_{r_m}^{r_n}x^{r_n}\\C_m^nx^n&=C_{q_m}^{q_n}C_{r_m}^{r_n}x^{q_np+r_n}\\C_m^nx^n&=C_{q_m}^{q_n}C_{r_m}^{r_n}x^n\end{aligned}Cmn​xnCmn​xnCmn​xn​=Cqm​qn​​xqn​pCrm​rn​​xrn​=Cqm​qn​​Crm​rn​​xqn​p+rn​=Cqm​qn​​Crm​rn​​xn​
两边同乘 inv(xn)inv(x^n)inv(xn),就有了 Cmn=CqmqnCrmrnC_{m}^n=C_{q_m}^{q_n}C_{r_m}^{r_n}Cmn​=Cqm​qn​​Crm​rn​​

得证。

本题

其实逆元的话直接要用的话直接 xp−2modpx^{p-2}\bmod pxp−2modp 更好,不用像我这样线性求出每个。

代码

#include<cstdio>
#define ll long longusing namespace std;ll T, n, m, p;
ll jc[100001], inv[100001];ll ksm(ll x, ll y) {ll re = 1;while (y) {if (y & 1) re = (re * x) % p;x = (x * x) % p;y >>= 1;}return re;
}ll C(ll x, ll y) {//暴力算组合数if (x > y) return 0;return ((jc[y] * inv[x]) % p * inv[y - x]) % p;
}ll work(ll n, ll m) {//Lucas 定理if (!n) return 1;return (work(n / p, m / p) * C(n % p, m % p)) % p;
}int main() {scanf("%lld", &T);while (T--) {scanf("%lld %lld %lld", &n, &m, &p);jc[0] = 1;for (ll i = 1; i <= p; i++)//预处理阶乘与其逆元jc[i] = (jc[i - 1] * i) % p;inv[p - 1] = ksm(jc[p - 1], p - 2);for (ll i = p - 2; i >= 0; i--)inv[i] = (inv[i + 1] * (i + 1)) % p;printf("%lld\n", work(n, n + m));}return 0;
}

【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)相关推荐

  1. 裴蜀定理(或 贝祖定理 )

    裴蜀定理(或 贝祖定理 ),说明了对任何 整数 a.b和它们的 最大公约数 d,关于 未知数 x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且 gcd (a,b)=d,那么对于任意的整数x,y ...

  2. donsker定理_中心极限定理和Donsker定理

    为什么要关心中心极限定理和Donsker定理 这可能就是Donsker定理要解决的问题.与Donsker定理相关的,还有Glivenko-Cantelli Theorem,似乎与中心极限定理与大数定律 ...

  3. 【组合数学】组合存在性定理 ( 三个组合存在性定理 | 有限偏序集分解定理 | Ramsey 定理 | 相异代表系存在定理 | Ramsey 定理内容概要 )

    文章目录 一.组合存在性定理 二.Ramsey 定理内容概要 一.组合存在性定理 组合存在性定理 主要有三个定理 , 有限偏序集分解定理 , Ramsey 定理 , 相异代表系存在定理 ; 1. 有限 ...

  4. (组合数学笔记)Pólya计数理论_Part.9_Pólya定理的推广——De Bruijn定理

    文章目录 写在前面 问题引入 推导1 定理 推导2 De Bruijn定理 定理的特殊情况 CCC上没有置换群 HHH上没有置换群 C,HC,\,HC,H上均没有置换群 例题 分析 写在前面 总结推广 ...

  5. 第7讲 替代定理、戴维南定理、诺顿定理

    替代定理.戴维南定理.诺顿定理 1.替代定理 2.戴维南定理 3.诺顿定理 4.戴维南定理和诺顿定理的等效 1.替代定理 ●内容: 任何一支路可以用一个独立电压源或独立电流源代替,只要电压源的电压等于 ...

  6. 高斯整数 / 费马平方和定理 / 拉格朗日的四平方定理

    一.高斯整数 形如 .(其中a,b是整数)的复数被称为高斯整数,高斯整数全体记作Z[i].注意到若 γ=a+bi 是高斯整数,则它是满足如下方程的代数整数: 通常我们使用希腊字母来表示高斯整数,例如α ...

  7. 初等数论四大定理之——费马小定理

    皮埃尔·德·费马(Pierre de Fermat),1601年生于法国,是一个律师和业余数学家.他在数学多个分支上都有贡献,成就甚至超过了许多职业的数学家,被誉为"业余数学家之王" ...

  8. 初等数论四大定理(威尔逊定理,欧拉定理,中国剩余定理,费马小定理)

    1.威尔逊定理:在初等数论中,威尔逊定理给出了判定一个自然数是否为素数的充分必要条件.即:当且仅当p为素数时:( p -1 )! ≡ p-1 ( mod p ),但是由于阶乘是呈爆炸增长的,其结论对于 ...

  9. 旋度定理(Curl Theorem)和散度定理(Divergence theorem)

    旋度和散度基础 首先说说格林公式(Green's theorem).对于一段封闭曲线,若其围城的区域D为单连通区域(内部任意曲线围城的区域都属于院区域),则有如下公式: 其中其中L为D的边界,取正方向 ...

最新文章

  1. php实现人工神经网络算法,BP人工神经网络实现
  2. AI艺术家带雕塑作品参展被海关扣押,只因摄像头眼睛被指涉及间谍行为?
  3. Redis key 相关命令
  4. 如何成为云原生时代的卓越架构师?
  5. 1.4)深度学习笔记------深层神经网络
  6. 纠偏的意思_承压能力和纠偏能力,决定成长的高度
  7. C++学习之路 | PTA乙级—— 1056 组合数的和 (15 分)(精简)
  8. 云小课|大数据时代的隐私利器-GaussDB(DWS)数据脱敏
  9. wincc怎么做一个弹出画面_wincc怎样弹出确认窗口?
  10. Tomcat 学习过程4
  11. 使用不同的膨胀和腐蚀方法对图像进行处理
  12. android逐帧播放器,Kinovea(逐帧播放器)
  13. 2018大华软件竞赛——模拟赛——第二题
  14. Android之制作Nine-Patch图片
  15. python批量读取tiff文件_Python Pillow批量转换tif格式到jpg
  16. 2020同济大学电子与信息工程学院计算机系夏令营机试题目
  17. tr命令解析_学习笔记
  18. js返回浏览器的顶部
  19. 广德现场:夜山明·潮牌酒倾情助阵第七届国际山地自行车开赛!
  20. 【券后价12.20元】【包邮】超能天然皂粉1028g1袋装家用肥皂粉正品家庭实惠装洗衣粉香味持久...

热门文章

  1. 局域网 了解DLNA, SAMBA(天天链N1 有这俩功能)
  2. win10修改用户文件夹名称
  3. 电路中0欧电阻的作用
  4. Hum Brain Mapp | 联合连接矩阵独立成分分析:结构和功能连接的自动链接
  5. Windows 个人版实现多用户远程登陆
  6. mysql哪个皮肤好用_免费皮肤控件的使用方法及效果测试USkin v2.2
  7. 多语言混合开发之易语言调用python算法
  8. “网络上有重名”问题解决方法
  9. 气质的培养(哈佛管理世界
  10. iphone中背景图的设置方法