Lucas(卢卡斯)定理

定义

若 \(p\) 为质数,且\(a\ge b\ge1\),则有:

\[C_{a}^{b}\equiv C_{a/p}^{b/p}\cdot C_{a (mod\,p)}^{b(mod\,p)}
\]

拆分a与b

按照 \(p\) 进制拆分 \(a\) 与 \(b\) ,设 \(a\) 与 \(b\) 是 \(k\) 位,不足用 \(0\) 补足。

\[\left\{\begin{aligned}
a&=a_0p^{0}+a_1p^{1}+\cdots+a_{k-1}p^{k-1}+a_kp^{k}\\
b&=b_0p^{0}+b_1p^{1}+\cdots+b_{k-1}p^{k-1}+b_kp^{k}
\end{aligned}\tag{1}
\right.
\]

证明\((1+x)^{p}\equiv1+x^p\,mod\,p\)

根据二项式定理有:

\[\begin{aligned}
(1+x)^p&=C_p^0x^0+C_p^1x^1+C_p^2x^2+\cdots+C_p^{p-1}x^{p-1}+C_p^px^p\\
&=1+C_p^1x+C_p^2x^2+\cdots+C_p^{p-1}x^{p-1}+x^p\\

\end{aligned}
\]

\(\because p为质数\therefore1\sim p-1均与p互质\\\therefore C_p^2,C_p^3,\cdots,C_p^{p-1}均能整除p,即C_p^2,C_p^3,\cdots,C_p^{p-1}\,mod\,p=0\)

\[(1+x)^p\equiv(1+x^p)\,mod\,p\tag{2}
\]

即 \((1+x)^p\) 在模 \(p\) 的意义下与 \((1+x^p)\) 同余。

根据 \((1+x)^a\) 求解 \(C_b^a\)

设 \(a=\lfloor \frac{a}{p}\rfloor p+a\%p\),\(a'=\lfloor \frac{a}{p}\rfloor\) 有:

\[\begin{aligned}
(1+x)^a&=(1+x)^{\lfloor \frac{a}{p}\rfloor p+a\%p}\\
&=(1+x)^{a'p+a\%p}\\
&=(1+x)^{a'p}(1+x)^{a\%p}\\
\because a\%p=a_0
\therefore &=(1+x)^{a'p}(1+x)^{a_0}\\
&=\underline{((1+x)^p)^{a'}}(1+x)^{a_0}\\
\because公式(2)
\therefore &=\underline{(1+x^p)^{a'}(1+x)^{a_0}}
\end{aligned}\tag{3}
\]

再设 \(a'=\lfloor \frac{a'}{p}\rfloor p+a'\%p\),\(a''=\lfloor \frac{a'}{p}\rfloor\) 有:

\[\begin{aligned}
((1+x)^p)^{a'}&=(1+x^p)^{\lfloor \frac{a'}{p}\rfloor p+a'\%p}\\
&=(1+x^p)^{a''p+a'\%p}\\
&=(1+x^p)^{a''p}((1+x)^p)^{a'\%p}\\
\because a'\%p=a_1
\therefore &=(1+x^p)^{a''p}((1+x)^p)^{a_1}\\
&=\underline{(1+x^p)^p)^{a''}((1+x)^p)^{a_1}}\\
\because公式(2)
\therefore &=\underline{(1+x^{p^2})^{a''}(1+x^p)^{a_1}}
\end{aligned}\tag{4}
\]

同理,可得到

\[(1+x^{p^2})^{a''}=(1+x^{p^3})^{a'''}\underline{(1+x^{p^2})^{a_2}}
\]

这样经过不断的迭代,最终得到:

\[(1+x)^a=(1+x^{p^k})^{a_k}*(1+x^{p^{k-1}})^{a_{k-1}}
*\cdots*(1+x^p)^{a_1}*(1+x)^{a_0}\tag{5}
\]

等式两边运用二项式分别求 \(C_a^bx^b\) ,右边可以看作 \(b\) 个球分到了 \(k\)个 盒子里,每个盒子里面得数量就是 \(b_i(1\le i\le k)\) 得

\[\begin{aligned}
C_a^bx^b&=C_{a_k}^{b_k}x^{p^kb_k}C_{a_{k-1}}^{b_{k-1}}x^{p^{k-1}b_{k-1}}\cdots C_{a_1}^{b_1}x^{pb_1}C_{a_0}^{b_0}x^{b_0}\\
&=(\prod_{i=0}^k{C_{a_i}^{b_i}})(x^{\sum_{i=0}^{k}{p^ib_i}})\\
\because 公式(1)中b的展开式
\therefore &=(\prod_{i=0}^k{C_{a_i}^{b_i}})x^b\\
\end{aligned}
\]

等式两边同时消去 \(x^b\) ,得:

\[C_a^b\,mod\,p\equiv \prod_{i=0}^{k}{C_{a_i}^{b_i}}\tag{6}
\]

根据递归的过程,也可写成:

\[C_a^b\,mod\,p=C_{a/p}^{b/p}C_{a\%p}^{b\%p}\tag{7}
\]

代码:

下面以AcWing 887. 求组合数 III为例:传送门

  • 使用 \(Lucas\) 定理主要使用公式\(7\)的递推式
  • 函数int C(int a, int b)实现\(C_a^b\)的求解,使用\(C_a^b=\frac{a*(a-1)*\cdots*(a-b+1)}{b*(b-1)*\cdots*1}\),分子用逆元即可
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 100010;
int n;
int p;
int qmi(int a, int b) {
int res=1;
while(b) {
if(b&1) res=(ll)res*a%p;
a=(ll)a*a%p;
b>>=1;
}
return res;
}
int C(int a, int b) {
int res=1;
for(int i=1,j=a;i<=b;++i,--j) {
res=(ll)res*j%p;
res=(ll)res*qmi(i,p-2)%p;
}
return res;
}
int lucas(ll a, ll b) {
if(a<p&&b<p) return C(a,b);
return (ll)C(a%p,b%p)*lucas(a/p,b/p)%p;
}
int main() {
#ifdef ONLINE_JUDGE
#else
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // ONLINE_JUDGE
scanf("%d",&n);
while(n--) {
ll a,b;
scanf("%lld%lld%lld",&a,&b,&p);
printf("%d\n",lucas(a,b));
}
return 0;
}

Lucas(卢卡斯)定理的更多相关文章

  1. Lucas 卢卡斯定理

    Lucas: 卢卡斯定理说白了只有一条性质 $$ C^n_m \equiv C^{n/p}_{m/p} \times C^{n \bmod p}_{m \bmod p} \ (mod \ \ p) $ ...

  2. CRT中国剩余定理 & Lucas卢卡斯定理

    数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...

  3. Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)

    Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...

  4. Lucas卢卡斯定理

    当$p$为素数时 $$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$$ 设$n=s*p+q,m\equiv t*p+r(q,r<=p)$ 我 ...

  5. Lucas(卢卡斯)定理

    公式 $$C_n^m\%p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}\%p~~(p为素数)$$ 代码如下 typedef long long ll; ll mod_pow(ll x, ...

  6. 卢卡斯定理 Lucas (p为素数)

    证明摘自:(我网上唯一看得懂的证明) https://blog.csdn.net/alan_cty/article/details/54318369 结论:(显然递归实现)lucas(n,m)=luc ...

  7. 卢卡斯定理Lucas

    卢卡斯定理Lucas 在数论中,\(Lucas\)定理用于快速计算\(C^m_n ~ \% ~p\),即证明\(C^m_n = \prod_{i = 0} ^kC^{m_i}_{n_i}\)其中\(m ...

  8. 数论篇7——组合数 & 卢卡斯定理(Lucas)

    组合数 组合数就是高中排列组合的知识,求解组合数C(n,m),即从n个相同物品中取出m个的方案数. 求解方式 求解通式:$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\righ ...

  9. Lucas(卢卡斯)定理

    Lucas定理 对于C(m,n)%P(P是质数)这样的问题,可以通过预处理阶乘和阶乘的逆元,来快速计算.但是当m,n大于P时,就不能保证m,n与P互质了,但不互质的情况下,乘法逆元不存在,此时就需要卢 ...

  10. 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)

    [模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...

随机推荐

  1. NGK内存将为全球投资者创造新的财富增长机会

    2020年,随着BTC的持续上涨带动了整个区块链市场的持续加温,同时金融市场也对金融体制做出了改变,关于金融和区块链的结合越来越被人们所认可,在此基础上,DeFi行业借此迎来了快速发展,据不完全统计, ...

  2. NGK DeFi项目即将上线,打造去中心化闭环金融生态!

    据最新官方消息称:NGK已于近日宣布将进军DeFi领域,NGK此次的DeFi的项目将会是一个去中心的交易平台,其最大的功能是进行数字货币的交换.在用户选择了需要支付的数字货币和想购买的数字货币后,系统 ...

  3. JavaScript数据类型判断的四种方法

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14416375.html 本文分享了JavaScript类型判断的四种方法:typeo ...

  4. 使用 mask 实现视频弹幕人物遮罩过滤

    经常看一些 LOL 比赛直播的小伙伴,肯定都知道,在一些弹幕网站(Bilibili.虎牙)中,当人物与弹幕出现在一起的时候,弹幕会"巧妙"的躲到人物的下面,看着非常的智能. 简单的 ...

  5. epoll 原理

    本文转载自epoll 原理 导语 以前经常被人问道 select.poll.epoll 的区别,基本都是靠死记硬背的,最近正好复习 linux 相关的内容,就把这一块做个笔记吧,以后也能方便查阅. e ...

  6. 微信小程序(七)-项目实例(原生框架 MINA转云开发)==02-云开发-配置

    云开发:1.就是用云函数的型式来使用云存储和云数据库完成各种操作!     2.只关注调什么函数,完成什么功能即可,无需关心HTTP请求哪一套!     3.此模式不代表没有服务器,只是部署在云环境中 ...

  7. yum安装MySQL8 - Centos8

    官方地址:https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html 参考博客地址:https://www.jia ...

  8. 如何安装jenkins并简单的使用

    如何安装jenkins并使用 一.jenkins 简介: Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括 : 1.持续的软件版本发布/测试项目: 2.监控外部调用 ...

  9. 顺序表及基本操作(C语言)

    #include <stdio.h> #include <stdlib.h> //基本操作函数用到的状态码 #define TRUE 1; #define FALSE 0; # ...

  10. 「UOJ 514」通用测评号(生成函数)

    首先,题目中的过程可以看作:每次选择任意一个燃料仓,给它装填 \(1\) 单位的燃料,如果此时恰好 "填满" 了它,就给答案 \(+1\). 考虑 \(n\) 号燃料仓填满的概率, ...