尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

扩展 Lucas 定理(exLucas)学习笔记 详解,一文带你彻底看懂扩展 Lucas 定理。---------------------著作权归作者所有。商业转载请联系作者获得授权,非商业

扩展 Lucas 定理(exLucas)学习笔记  详解,一文带你彻底看懂扩展 Lucas 定理。---------------------著作权归作者所有。商业转载请联系作者获得授权,非商业
📅 发布时间:2026/7/9 5:14:51

算法流程 由于 � m 不是质数,我们考虑以下的这三个步骤。它们组成了扩展 Lucas 的思路框架。 我们将模数 � m 分解质因数: � = � 1 � 1 � 2 � 2 ⋯ � � � � m=p 1 a 1​​p 2 a 2​​⋯p n a n​​; 我们构造方程组: { � ≡ � 1 ( m o d � 1 � 1 ) � ≡ � 2 ( m o d � 2 � 2 ) ⋯ ⋯ � ≡ � � ( m o d � � � � ) ⎩ ⎨ ⎧​x≡r 1​(modp 1 a 1​​) x≡r 2​(modp 2 a 2​​) ⋯⋯ x≡r n​(modp n a n​​)​注意到这些方程里的模数两两互质。我们使用 CRT 合并求解 � x ,即为我们想要的答案 ( � � ) m o d � ( r n​)modm 。 接下来的问题就完全聚焦到了 � � r i​的构造上来。我们考虑如下流程: 明确我们要构造 � � ≡ ( � � ) ( m o d � � � � ) r i​≡( r n​)(modp i a i​​) ; 转化问题。我们需要求解 ( � � ) m o d � � ( r n​)modp a ,其中 � p 是质数。即我们要求解如下式子: � ! � ! ( � − � ) ! m o d � � n!(n−r)! n!​modp a 注意到分母 � ! ( � − � ) ! r!(n−r)! 与 � � p a 不一定互质。那么就意味着我们没有办法求分母的逆元,进一步我们无法求解这个分式。考虑我们该如何改写它。 我们目标是使分母和 � � p a 互质。为此我们将式子改写为: � � ( � ! ) � ( � ! ) � ( ( � − � ) ! ) � m o d � � p v (r!) p​((n−r)!) p​(n!) p​​modp a 其中 � = � � ( � ! ) − � � ( � ! ) − � � ( ( � − � ) ! ) v=v p​(n!)−v p​(r!)−v p​((n−r)!) 。注意到若 � ≥ � v≥a ,则结果为 0 0 。 计算 � � ( � ! ) v p​(n!) 。这可以利用 Legendre 公式求出: � � ( � ! ) = ∑ � = 1 ∞ ⌊ � � � ⌋ v p​(n!)= i=1 ∑ ∞​⌊ p i n​⌋ 计算 ( � ! ) � (n!) p​。利用前置知识中提到的递归公式: ( � ! ) � ≡ ( ± 1 ) ⌊ � / � � ⌋ ( ⌊ � / � ⌋ ! ) � ( ∏ 1 ≤ � ≤ ( � m o d � � ) 且 � ∤ � � ) ( m o d � � ) (n!) p​≡(±1) ⌊n/p a ⌋ (⌊n/p⌋!) p​​1≤j≤(nmodp a )且j∤p ∏​j​(modp a ) 一些注意事项: i. ( ⌊ � / � ⌋ ! ) � (⌊n/p⌋!) p​可以利用循环来展开递归,加快速度; ii. ∏ � ∏j 项,等价于在 ( � m o d � � ) ! (nmodp a )! 中去掉 � p 因子,故这里可以直接预打表,用 f[i] 来表示 � ! i! 中去掉 � p 因子的值。这个表只用打到 � < � � i

#include #define fastio ios::sync_with_stdio(0);cin.tie(0);cout.tie(0) #define int long long #define MIKU 0 using namespace std; int n, m, p; //求解 C(n,m) mod p。 //扩展欧几里得求逆元。 int exgcd(int a, int b, int &x, int &y) { if(b == 0) {x = 1; y = 0; return a;} int d = exgcd(b, a%b, y, x); y -= a / b * x; return d; } int inv(int a, int m) { int x, y; exgcd(a, m, x, y); return (x % m + m) % m; } //对每个质因数构造 r_i struct BPP { int p, a, pa; //p:模数 a:次数 pa:p^a。 vector f; //预处理 f[i] ,表示 i! 去掉 p 因子。 //构造函数,计算出 pa 和 f。 BPP(int prime, int power) : p(prime), a(power) { pa = 1; for(int i=1; i<=a; i++) pa *= p; f.resize(pa); f[0] = 1; for(int i=1; i1; n/=p) { if((n / pa) & neg) res = pa - res; //这一步完成符号修正,即公式中第一个因子。 res = res * f[n%pa] % pa; } return res; } //利用 vp(n!) 和 (n!)_p 算 C(n,r) mod p^a。 int C(int n, int r) { int v = vp(n) - vp(r) - vp(n-r); if(v >= a) return 0; int res = fac(n) * inv(fac(r) * fac(n-r) % pa, pa) % pa; for(; v; v--) res = res * p % pa; return res; } }; //扩展 Lucas ,负责完成质因数分解和 CRT 合并。 int exLucas(int n, int r, int m, int res = 0) { int tmp = m; for(int p=2; p*p<=tmp; p++) { //试除法分解质因数。 if(tmp % p) continue; int a = 0, pa = 1; for(; tmp%p==0; tmp/=p) a ++, pa *= p; BPP bpp = BPP(p, a); int ri = bpp.C(n, r); int mi = m / pa; res = (res + mi * ri % m * inv(mi, pa)) % m; // CRT 合并公式。 } if(tmp > 1) { BPP bpp = BPP(tmp, 1); int ri = bpp.C(n, r); int mi = m / tmp; res = (res + mi * ri % m * inv(mi, tmp)) % m; } return res; } signed main() { fastio; cin>>n>>m>>p; cout< � s m​>n 是无解。 主要难点是不保证模数为质数。这就需要用到扩展 Lucas 定理。 下面贴出代码。相比于上面的模板代码,只改动了主函数。 Show Me the Code
---------------------
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Yzu_EtherealYz
源地址:https://www.cnblogs.com/Yzu-EtherealYz/p/20334937
来源:博客园cnblogs
© 版权声明:本文为博主原创文章,转载请附上博文链接!

相关新闻

  • AI搜索优化公司排名:年度服务商综合评测
  • 从0到1搭一个云原生大模型推理平台:FastAPI + vLLM + Kubernetes + Prometheus
  • Ubuntu 22.04下编译安装wave2Foam与OpenFOAM v2206完整指南

最新新闻

  • 仅限本周开放:ChatGPT+Midjourney高阶工作流训练营核心课件(含137个真实商业项目Prompt库、风格迁移对照表、客户验收话术包)
  • 科普时刻 | 什么是MEMS器件?
  • Agent 人机协作闭环:AI 做事,人做决策,别把 Loop 写成死循环
  • 简历看起来都差不多?怎么挑出真正“对的人”
  • 2026 薪酬数字化调研:AI 薪资系统将核算工时压缩 80%,大幅降低合规稽查风险
  • CTF密码学经典题解题writeup

日新闻

  • SQL 查询语句的标准逻辑执行顺序(即语义处理顺序),它与实际书写顺序不同,但决定了数据库如何解析和执行查询
  • ORB-SLAM2 重定位模块深度解析:从 BoW 候选帧到 PnP 优化的 6 步流程
  • 罗技鼠标宏压枪脚本终极指南:从原理到实战的完整解析

周新闻

  • 基于YOLOv12的番茄成熟度智能检测系统开发
  • 终极RimWorld模组管理指南:用RimSort告别模组冲突烦恼
  • AI Agent框架开发:从理论到实践的完整指南

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号