Lucas/exLucas 定理 学习笔记

0x00 前言

Lucas 定理适用于求在模质数 p 意义下的组合数(exLucas 不需要质数的条件)。此时 p 一般不大,但 n,m 很大,无法通过常规的方法预处理(一是空间可能开不下,二是如果 m>p,则 nmm 不一定有逆元)。

当然你可以用杨辉三角递推,但这是 O(n2) 的。

0x01 方法

先上结论,当 p 为质数时,有 (nm)(npmp)×(nmodpmmodp)(modp)。当 n<m 时,规定 (nm)=0

0x02 原理

就是证明这个柿子。

引理:若 x 是小于质数 p 的正整数,则 (px)0(modp)

证明:因为 x<p,则 x 存在关于 p 的逆元。那么有 (px)p!x!(px)!(p1)!(x1)!(px)!×px(p1x1)×p×inv(x)(modp),得证。

根据二项式定理,得到 (1+x)n=i=0n(ni)xi1+xn(modp)

pn=np,qn=nmodp,pm=mp,qm=mmodp

(1+x)n=(1+x)pnp+qn(1+xp)pn(1+x)qn=i=0pnj=0qn(pni)(qnj)xip+j=m=0n(pnpm)(qnqm)xmm=0n(nm)xm

对比系数就可以得到上式。

0x03 实现

可以通过递归的方式实现。

点击查看代码
int C(int n,int m,int p){
	if(n<0||m<0||n-m<0)return 0;
	return jc[n]*ij[m]%p*ij[n-m]%p;
}
int Lucas(int n,int m,int p){
	if(n==0)return 1;
	return Lucas(n/p,m/p,p)*C(n%p,m%p,p)%p;
}

时间复杂度 O(p+logpn)(线性预处理 p 以内的逆元)。

0x04 拓展

p 不为质数时,需要用到 exLucas 定理。

待补。https://oi.wiki/math/number-theory/lucas/

0x05 应用

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

板。

P1313 [NOIP2011 提高组] 计算系数

二项式定理。

posted @   xx019  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
点击右上角即可分享
微信分享提示