卢卡斯定理 / Lucas\text{Lucas}Lucas定理

现有问题:

给定整数 n,m,pn,m,pn,m,p,求 (nm)modp\dbinom{n}{m}\bmod p(mn​)modp,保证 p∈Pp\in\mathbb{P}p∈P。

1≤n,m,p≤1051\leq n,m,p \leq 10^51≤n,m,p≤105。

可以用 Lucas 定理解决。

定义

对于 p∈Pp\in\mathbb{P}p∈P,有 (nm)modp=(⌊n/p⌋⌊m/p⌋)×(nmodpmmodp)modp\dbinom{n}{m}\bmod p = \dbinom{\lfloor n / p \rfloor}{\lfloor m / p \rfloor}\times\dbinom{n\bmod p}{m\bmod p}\bmod p(mn​)modp=(⌊m/p⌋⌊n/p⌋​)×(mmodpnmodp​)modp

另一种形式:(nm)modp=∏i=1k(aibi)modp\dbinom{n}{m}\bmod p = \displaystyle\prod\limits_{i=1}^k\dbinom{a_i}{b_i}\bmod p(mn​)modp=i=1∏k​(bi​ai​​)modp(a,ba,ba,b 分别为 n,mn,mn,m 在 ppp 进制下的某一位,kkk 是它们 ppp 进制位数的较大值)。

证明

以下的 p∈Pp\in\mathbb{P}p∈P。

∵(pn)modp=p!n!(p−n)!=[n=0∨n=p]\because\dbinom{p}{n}\bmod p = \displaystyle\frac{p!}{n!(p-n)!}=[n=0 \lor n=p]∵(np​)modp=n!(p−n)!p!​=[n=0∨n=p]

∴(a+b)p=∑n=0p(pn)anbp−n≡∑n=0p[n=0∨n=p]anbp−n≡ap+bp(modp)\begin{aligned}\therefore(a+b)^p&=\displaystyle\sum\limits_{n=0}^p\dbinom{p}{n}a^nb^{p-n}\\&\equiv\sum_{n=0}^p[n=0\lor n=p]a^nb^{p-n}\\&\equiv a^p+b^p(\bmod p)\end{aligned}∴(a+b)p​=n=0∑p​(np​)anbp−n≡n=0∑p​[n=0∨n=p]anbp−n≡ap+bp(modp)​

上面的结论可以用费马小定理推,但是这里没有用。所以这个推导也适用于多项式。

设 fp(x)=(axn+bxm)modpf^p(x)=(ax^n+bx^m)\bmod pfp(x)=(axn+bxm)modp,则

(axn+bxm)p≡apxpn+bpxpm≡axpn+bxpm≡f(xp)(modp)\begin{aligned}(ax^n+bx^m)^p&\equiv a^px^{pn}+b^px^{pm}\\&\equiv ax^{pn}+bx^{pm}\\&\equiv f(x^p)(\bmod p)\end{aligned}(axn+bxm)p​≡apxpn+bpxpm≡axpn+bxpm≡f(xp)(modp)​

设 s=⌊np⌋,t=⌊mp⌋,q=nmodp,w=mmodps=\lfloor\displaystyle\frac{n}{p}\rfloor, t=\lfloor\displaystyle\frac{m}{p}\rfloor,q=n\bmod p, w=m\bmod ps=⌊pn​⌋,t=⌊pm​⌋,q=nmodp,w=mmodp,则有 n=sp+q,m=tp+wn=sp+q,m=tp+wn=sp+q,m=tp+w。

(1+x)n≡((1+x)p)s(1+x)q≡(1+xp)s+(1+x)q≡∑i=1s(si)xpi×∑i=1q(qj)xj(modp)\begin{aligned}(1+x)^n&\equiv ((1+x)^p)^s(1+x)^q\\&\equiv (1+x^p)^s+(1+x)^q\\&\equiv\sum\limits_{i=1}^s\dbinom{s}{i}x^{pi}\times\sum\limits_{i=1}^q\dbinom{q}{j}x^{j} (\bmod p)\end{aligned}(1+x)n​≡((1+x)p)s(1+x)q≡(1+xp)s+(1+x)q≡i=1∑s​(is​)xpi×i=1∑q​(jq​)xj(modp)​

又 (1+x)n=∑i=1sp+q(sp+qi)xi(1+x)^n=\displaystyle\sum\limits_{i=1}^{sp+q}\dbinom{sp+q}{i}x^i(1+x)n=i=1∑sp+q​(isp+q​)xi

∴∑i=1sp+q(sp+qi)xi≡∑i=1s(si)xpi×∑i=1q(qj)xj(modp)\therefore\displaystyle\sum\limits_{i=1}^{sp+q}\dbinom{sp+q}{i}x^i\equiv\sum\limits_{i=1}^s\dbinom{s}{i}x^{pi}\times\sum\limits_{i=1}^q\dbinom{q}{j}x^{j} (\bmod p)∴i=1∑sp+q​(isp+q​)xi≡i=1∑s​(is​)xpi×i=1∑q​(jq​)xj(modp)

可以发现,当 m≤nm\leq nm≤n 时,两边都有 xtp+mx^{tp+m}xtp+m 项。对比两边系数:

(sp+qtp+w)xtp+w≡(st)xtp×(qw)xw(sp+qtp+w)≡(st)×(qw)(nm)≡(⌊np⌋⌊mp⌋)(nmodpmmodp)(modp)\begin{aligned} \dbinom{sp+q}{tp+w}x^{tp+w}&\equiv \dbinom{s}{t}x^{tp}\times\dbinom{q}{w}x^w\\ \dbinom{sp+q}{tp+w}&\equiv\dbinom{s}{t}\times\dbinom{q}{w}\\ \dbinom{n}{m}&\equiv\dbinom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{m}{p}\rfloor}\dbinom{n\bmod p}{m \bmod p}(\bmod p) \end{aligned} (tp+wsp+q​)xtp+w(tp+wsp+q​)(mn​)​≡(ts​)xtp×(wq​)xw≡(ts​)×(wq​)≡(⌊pm​⌋⌊pn​⌋​)(mmodpnmodp​)(modp)​

得证。

const int N = 1e5 + 10;
long long A[N];//预处理出阶乘
long long qp(long long a, long long b, long long p);//快速幂
long long C(long long n, long long m, long long p){if(m > n) return 0;return (A[n] * qp(A[m], p-2, p) % p) * qp(A[n-m], p-2, p) % p;
}
long long Lucas(long long n, long long m, long long p){if(!m) return 1;return C(n%p, m%p, p) * Lucas(n/p, m/p, p) % p;
}
long long solve(long long n, long long m, long long p){A[0] = 1;for(int i = 1; i <= n; ++ i) A[i] = A[i-1] * i % p;return Lucas(n, m, p);
}

例题

Luogu P2480 [SDOI2010] 古代猪文(基础数论全家桶)

求 g∑d∣nCndmod999911659g^{\sum_{d|n} C_n^d}\bmod 999911659g∑d∣n​Cnd​mod999911659。

1≤n,g≤1091\leq n,g \leq 10^91≤n,g≤109。

  • 因为 999911659∈P999911659\in \mathbb{P}999911659∈P。
  • 所以由欧拉定理可知,g999911658≡1(mod999911659)g^{999911658}\equiv 1(\bmod 999911659)g999911658≡1(mod999911659),注意这里要有个特判:当 g=999911659g=999911659g=999911659 时直接输出 000 结束程序。
  • 所以原式 =g∑d∣nCndmod999911658mod999911659=g^{\sum_{d|n} C_n^d\bmod999911658}\bmod 999911659=g∑d∣n​Cnd​mod999911658mod999911659。
  • 999911658=2∗3∗4679∗35617999911658=2*3*4679*35617999911658=2∗3∗4679∗35617。
  • 令 t=∑d∣nCndmod999911658t=\sum_{d|n} C_n^d\bmod999911658t=∑d∣n​Cnd​mod999911658。
  • 则 {t≡∑d∣nCnd(mod2)t≡∑d∣nCnd(mod3)t≡∑d∣nCnd(mod4679)t≡∑d∣nCnd(mod35617)\begin{cases}t\equiv\sum_{d|n} C_n^d(\bmod2)\\t\equiv\sum_{d|n} C_n^d(\bmod3)\\t\equiv\sum_{d|n} C_n^d(\bmod4679)\\t\equiv\sum_{d|n} C_n^d(\bmod35617)\end{cases}⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​t≡∑d∣n​Cnd​(mod2)t≡∑d∣n​Cnd​(mod3)t≡∑d∣n​Cnd​(mod4679)t≡∑d∣n​Cnd​(mod35617)​。
  • 每一项用 Lucas,然后用 CRT 求 ttt。
typedef long long ll;
const int N = 35620, P = 999911658;
ll A[N], x[4], y[4] = {2, 3, 4679, 35617};
ll qp(ll a, ll b, ll p);
ll C(ll n, ll m, ll p);
ll Lucas(ll n, ll m, ll p);
ll CRT(){ll ans = 0;for(int k = 0; k <= 3; ++ k)ans = (ans + x[k] * (P/y[k]) % P * qp(P/y[k], y[k]-2, y[k])) % P;return ans;
}
ll solve(ll n, ll g){if(g == P + 1) return 0;for(int k = 0; k <= 3; ++ k){A[0] = 1;for(ll i = 1; i <= y[k]; ++ i) A[i] = A[i-1] * i % y[k];for(ll i = 1; i * i <= n; ++ i) if(n%i == 0){x[k] = (x[k] + Lucas(n, i, y[k])) % y[k];if(i * i != n) x[k] = (x[k] + Lucas(n, n/i, y[k])) % y[k];}}return qp(g, CRT(), P+1);
}

扩展卢卡斯定理 / exLucas\text{exLucas}exLucas

问题如下:

给定整数 n,m,pn,m,pn,m,p,求 (nm)modp\dbinom{n}{m}\bmod p(mn​)modp,保证 p∈Pp\in\mathbb{P}p∈P。

1≤n,m≤1018,2≤p≤1061\leq n,m \leq 10^{18}, 2\leq p \leq 10^61≤n,m≤1018,2≤p≤106。

其实和 Lucas 没什么关系。以下是解决步骤:

解法

Step 1. 分解 ppp

对于 ppp 进行质因数分解:p=∏i=1rpikip=\prod\limits_{i=1}^r p_i^{k_i}p=i=1∏r​piki​​。将原式化成若干同余方程:

{(nm)≡a1(modp1k1)(nm)≡a2(modp2k2)...(nm)≡ai(modpiki)\begin{cases}\dbinom{n}{m}\equiv a_1(\bmod p_1^{k_1})\\\dbinom{n}{m}\equiv a_2(\bmod p_2^{k_2})\\...\\\dbinom{n}{m}\equiv a_i(\bmod p_i^{k_i})\end{cases}⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧​(mn​)≡a1​(modp1k1​​)(mn​)≡a2​(modp2k2​​)...(mn​)≡ai​(modpiki​​)​

因为 pikip_i^{k_i}piki​​ 两两互素,最后使用 CRT 求解即可。

Step 2. 求解 aia_iai​

ai=(nm)modpiki=n!m!(n−m)!modpikia_i=\dbinom{n}{m}\bmod p_i^{k_i}=\displaystyle\frac{n!}{m!(n-m)!}\bmod p_i^{k_i}ai​=(mn​)modpiki​​=m!(n−m)!n!​modpiki​​,但是 pikip_i^{k_i}piki​​ 仍然不是质数,不能求出分母的逆元。所以将分子分母的所有 pip_ipi​ 提出来:

ai=n!pik1m!pik2×(n−m)!pik3×pik1−k2−k3a_i=\displaystyle\frac{\frac{n!}{p_i^{k_1}}}{\frac{m!}{p_i^{k_2}}\times\frac{(n-m)!}{p_i^{k_3}}}\times p_i^{k1-k2-k3}ai​=pik2​​m!​×pik3​​(n−m)!​pik1​​n!​​×pik1−k2−k3​,分母可以求逆元。

Step 3.求解 n!pk\displaystyle\frac{n!}{p^k}pkn!​

举个例子:n=22,p=3,k=2n=22,p=3,k=2n=22,p=3,k=2。

n!=1∗2∗...∗22=37∗(1∗2∗3∗4∗5∗6∗7)∗(1∗2∗4∗5∗7∗8)∗(10∗11∗13∗14∗16∗17)∗(19∗20∗22)≡37∗7!∗(1∗2∗4∗5∗7∗8)2∗(1∗2∗4)(modpk)\begin{aligned}n!&=1*2*...*22\\&=3^7*(1*2*3*4*5*6*7)*(1*2*4*5*7*8)*(10*11*13*14*16*17)*(19*20*22)\\&\equiv3^7*7!*(1*2*4*5*7*8)^2*(1*2*4)(\bmod p^k)\end{aligned}n!​=1∗2∗...∗22=37∗(1∗2∗3∗4∗5∗6∗7)∗(1∗2∗4∗5∗7∗8)∗(10∗11∗13∗14∗16∗17)∗(19∗20∗22)≡37∗7!∗(1∗2∗4∗5∗7∗8)2∗(1∗2∗4)(modpk)​

分为三个部分

  • 373^737 为 pnpp^{\frac{n}{p}}ppn​(会被分母消掉,不用算)。
  • 7!7!7! 递归求解
  • 在modpk\mod p^kmodpk 意义下是循环节,有 npk\frac{n}{p^k}pkn​ 个,剩下的那部分暴力求解。
ll calc(ll n, ll p, ll pk){if(!n) return 1;ll ans = 1;for(ll i = 1; i <= pk; ++ i)//每个循环节if(i % p) ans = ans * i % pk;ans = qp(ans, n/pk, pk);//所有循环节for(ll i = 1; i <= n % pk; ++ i)//剩下的if(i % p) ans = ans * i % pk;return ans * calc(n/p, p, pk) % pk;//递归求解
}

完整代码

typedef long long ll;
const int N = 1e6 + 10;
ll a[N], b[N]; int tot;
ll qp(ll a, ll b, ll p);
void exgcd(ll &x, ll &y, ll a, ll b);
ll inv(ll x, ll p);
ll calc(ll n, ll p, ll pk){if(!n) return 1; ll ans = 1;for(ll i = 1; i <= pk; ++ i) if(i%p) ans = ans * i % pk;ans = qp(ans, n/pk, pk);for(ll i = 1; i <= n%pk; ++i) if(i%p) ans = ans * i % pk;return ans * calc(n/p, p, pk) % pk;
}
ll C(ll n, ll m, ll p, ll pk){if(!n || !m || n==m) return 1; if(n < m) return 0;ll nn = calc(n, p, pk), mm = calc(m, p, pk), nm = calc(n-m, p, pk);ll cnt = 0, k = n - m;//cnt即上文k1-k2-k3while(n) n /= p, cnt += n;while(m) m /= p, cnt -= m;while(k) k /= p, cnt -= k;return nn * inv(mm, pk) % pk * inv(nm, pk) % pk *qp(p, cnt, pk) % pk;
}
ll CRT(){ll M = 1, ans = 0;for(int i = 1; i <= tot; ++ i) M *= b[i];for(int i = 1; i <= tot; ++ i)ans += a[i] * (M/b[i]) * inv(M/b[i], b[i]);return (ans % M + M) % M;
}
ll exLucas(ll n, ll m, ll p){for(ll i = 2; i * i <= p && p >= 1; ++ i){ll pk = 1;while(p%i == 0) p /= i, pk *= i;if(pk > 1) a[++tot] = C(n, m, i, pk), b[tot] = pk;}if(p > 1) a[++tot] = C(n, m, p, p), b[tot] = p;return CRT();
}

OI模板 卢卡斯定理相关推荐

  1. 洛谷——P3807 【模板】卢卡斯定理

    P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...

  2. P4720 【模板】扩展卢卡斯定理/exLucas(无讲解,纯记录模板)

    P4720 [模板]扩展卢卡斯定理/exLucas 题意: CnmmodpC_{n}^{m}\bmod pCnm​modp 对于 100% 的数据,1≤m≤n≤1018,2≤p≤106,不保证 p 是 ...

  3. 洛谷 P3807 【模板】卢卡斯定理

    题目背景 这是一道模板题. 题目描述 给定n,m,p(1\le n,m,p\le 10^51≤n,m,p≤105) 求 C_{n+m}^{m}\ mod\ pCn+mm​ mod p 保证P为prim ...

  4. 洛谷 P4720 【模板】扩展卢卡斯定理/exLucas

    [模板]扩展卢卡斯定理/exLucas 题目背景 这是一道模板题. 题目描述 求 Cnmmodp{\mathrm{C}}_n^m \bmod{p}Cnm​modp 其中 C\mathrm{C}C 为组 ...

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

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

  6. 【数学】扩展卢卡斯定理

    Description 求 ( n m ) m o d p \dbinom{n}{m}\bmod p (mn​)modp 其中 p p p 较小且 不保证 p p p 是质数. Method 前置芝士 ...

  7. OI模板大全(普及~省选NOI)

    整理的算法模板合集: ACM模板 hhh刚从某位大佬的洛谷首页偷到了一个好玩的东西 大佬在这儿 自己对照了一下原来我还有这么多东西没有学呜呜呜我好菜 普及- 模板大全续表续表A并查集A快速幂-取余运算 ...

  8. 卢卡斯定理及其卢卡斯定理的拓展

    前言: 求一个组合数 ,我们可以通过逆元的方式在 O(n)的时间复杂度内求出 但如果数特别大时(数据范围 ),又该怎么办 使用卢卡斯定理求解 卢卡斯定理:(组合数取模,取模的模数只能是质数) 即  模 ...

  9. 【知识总结】扩展卢卡斯定理(exLucas)

    扩展卢卡斯定理用于求如下式子(其中 p p p不一定是质数): C n m m o d p C_n^m\ mod\ p Cnm​ mod p 我们将这个问题由总体到局部地分为三个层次解决. 层次一:原 ...

最新文章

  1. 直播回顾|结构光3D相机光机核心技术及3D成像性能分析
  2. Logback日志跨线程追踪实践
  3. PHP调用wsdl文件类型的接口代码分享
  4. Intel Realsense D435 python multiprocessing 摄像头多进程流传输
  5. NSArray ----NSMutableArray
  6. 分布式系统框架Spring+Redis+SSO视频课程
  7. Codeforces Round #701 (Div. 2) C. Floor and Mod 数学分块
  8. 怎样使用Eclipse来开发Android源码
  9. Java快速入门学习笔记9 | Java语言中的方法
  10. MyEclipse安装JS代码提示(Spket插件)
  11. 下载的****.ts格式的视频在迅雷播放器中无法播放
  12. 4g网络切换软件_游戏掉线坑队友?OPPO Reno网络切换超快,上分吃鸡更稳
  13. 惠普HP CM1312nfi彩色激光打印机硒鼓替代方案
  14. linux像win7,如何使Ubuntu看起来像Windows 7
  15. Matlab fftshift and ifftshift and some confusions
  16. Caused by: org.hibernate.AssertionFailure: Subclass has to be binded after it's mother class:
  17. 不租服务器,自建个人商业网站(如何购买域名)
  18. 家居家装行业人群洞察白皮书.pdf
  19. 鸿蒙开发板hi3861 hispark code 2.0 canary金丝雀版本,gpio如何上拉电阻呢?
  20. 一个简单的BitTorrent客户端实现(六):peer manager和peer实现

热门文章

  1. java.library.path和LD_LIBRARY_PATH的介绍与区别
  2. Find My产品|苹果Find My技术助力儿童鞋发展
  3. Excel数据透视表、数据透视图
  4. 好用的vue组件插件及框架
  5. 开发一个发送手机短信的计算机软件
  6. 【oracle】oracle筛选后导出表,载入对象选择,保存对象选择,save object selection的使用,过滤clob导出,利用osf文件
  7. UTC与BJT时间换算C语言
  8. 如何使用Python打开一个TXT文件
  9. 灭霸打了一个响指,我就学会了C语言的「分支与循环语句」
  10. 2.5 Moblin项目提供的开发工具