卢卡斯定理
对于解决组合数取模求解时,可以使用 卢卡斯(Lucas)定理 的内容解决。
当数据范围不大时,我们可以使用 1. 递推公式;2. 预处理阶乘 的许多方法进行。
但当 , 且 为素数的时候,以上的方法都会用不了了。
Lucas 定理
内容
卢卡斯定理的内容为:对于任意 为素数,有
-
因为要求出 的值,所以用到 Lucas 定理 的时候,要保证 的范围不能太大。
-
其中 可以使用 Lucas定理 继续求解,直到边界条件 返回 。
int Lucas(int n, int m)
{
if (m == 0) return 1;
return Lucas(n/p, m/p)*C(n%p, m%p)% p;
}
特别地
卢卡斯定理,也可以理解为:
将 与 转换为两个 进制数,然后对 这两个 进制数的相同的位的数,进行组合数取模,然后相乘。
int lucas(int n,int m)
{
x[0]=y[0]=0;
int ans=1;
while(n){x[++x[0]]=n%p; n/=p;}
while(m){y[++y[0]]=m%p; m/=p;}
for(int i=1;i<=max(x[0],y[0]);i++){
ans=ans*C[x[i]][y[i]]%p;
}
return ans;
}
剩余的
- 相对于其他知识来说,Lucas定理也存在 ExLucas定理,用于求解 不为素数的情况。
- 卢卡斯定理的证明。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效