前言

Oi wiki 和网上博客的证明都没完全看懂,最后还是自己推出来的。。这里记录一下思路。

Lucas 定理

对于质数 \(p\),$${n\choose m}\bmod p={\lfloor n/p\rfloor\choose \lfloor m/p\rfloor}\cdot{n\bmod p\choose m\bmod p}\bmod p$$

可以接着递归展开 \({\lfloor n/p\rfloor\choose \lfloor m/p\rfloor}\),把所有组合数中系数降到 \(\le p-1\)。展开后有时可以视作一个 \(p-1\) 进制数,为数位DP提供可能性。

朴素的Lucas 定理可以加速大组合数对质数取模的运算。

证明Lucas 定理

二项式定理

对于 \(x,y\in R,n\in N\),有:

\[(x+y)^n=\sum_{i=0}^n{n\choose i}x^iy^{n-i}
\]

引理 1

\[{p\choose n}\bmod p = [n=0\vee n=p]
\]

证明引理 1

\({p\choose n}={p!\over n!(p-n)!}\),分子中有有一个因子 \(p\),若不消去这个因子那么原式为 \(0\);消去这个因子当且仅当 \(p=n\vee p=p-n\),即 \(p=n\vee n=0\),此时原式为 \({1\over 0!}\),根据定义等于 \(1\)。得证。

引理 2

\[(a+b)^p\equiv a^p+b^p\pmod p
\]

证明引理 2

先二项式定理展开有

\[(a+b)^p\equiv \sum_{n=0}^p{p\choose n}a^nb^{p-n}\pmod p
\]

由引理 1,上式只有 \(n=0\vee n=p\) 时有值,即

\[\equiv a^p+b^p\pmod p
\]

证明Lucas 定理

不妨把 \({n\choose m}\bmod p\) 看做是 \((1+x)^n\bmod p\) 在 \(x^m\) 项的系数。

由 \(n=p\lfloor n/p\rfloor+n\bmod p\) 先把指数拆成两部分

\[(1+x)^n\bmod p=(1+x)^{p\lfloor n/p\rfloor}(1+x)^{n\bmod p}\bmod p
\]

由引理 2,\((1+x)^{p\lfloor n/p\rfloor}=(1+x^p)^{\lfloor n/p\rfloor}\),即

\[(1+x^p)^{\lfloor n/p\rfloor}(1+x)^{n\bmod p}\bmod p
\]

再二项式定理展开,有

\[\sum_{i=0}^{\lfloor n/p\rfloor}{\lfloor n/p\rfloor\choose i}x^{ip}\sum_{j=0}^{n\bmod p}{n\bmod p\choose j}x^j\bmod p
\]

那么 \(x^m\) 项系数的另一种表达方式就有

\[\sum_{i=0}^{\lfloor n/p\rfloor}\sum_{j=0}^{n\bmod p}\sum_{ip+j=m}{\lfloor n/p\rfloor\choose i}{n\bmod p\choose j}\bmod p
\]

不难验证 \(i=\lfloor m/p\rfloor,j=m\bmod p\) 是一组符合枚举范围(当\(n\ge m\))的方程 \(ip+j=m\) 的解。如果我们能证明这是唯一解那么就能完善证明Lucas 定理了!

考虑其它解形如 \(i=\lfloor m/p\rfloor-k,j=m\bmod p+kp,k\in Z,k\neq0\) 的情形。由于限制了 \(0\le j\le {n\bmod p}\),这些解已经不成立。因为 \(n\bmod p\) 和 \(m\bmod p\) 最大不超过 \(p-1\),而 \(j\) 要么小于 \(0\) 要么 大于 \(p-1\)。这意味着 \(i=\lfloor m/p\rfloor,j=m\bmod p\) 就是其唯一的一组合法解。也就是说上式就等于

\[{\lfloor n/p\rfloor \choose \lfloor m/p\rfloor}{n\bmod p\choose m\bmod p}\bmod p
\]

也就得到

\[{n\choose m}\bmod p={\lfloor n/p\rfloor\choose \lfloor m/p\rfloor}\cdot{n\bmod p\choose m\bmod p}\bmod p
\]

得证。

模板代码

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

就是Lucas 定理的模板。但是数据范围太水了,预处理下来甚至不需要Lucas 定理就能过。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn = 1e5 + 10;
int T, n, m, p;
ll frac[maxn]; int qpow(ll x, int y) {
ll res = 1;
while(y) {
if(y & 1) (res *= x) %= p, y--;
(x *= x) %= p; y /= 2;
}
return (int)res;
} int C(int n, int m){
return (m > n) ? 0 : frac[n] * qpow(frac[m], p - 2) % p * qpow(frac[n - m], p - 2) % p;
}
int lucas(int n, int m) {
return (m == 0) ? 1 : C(n % p, m % p) * lucas(n / p, m / p) % p;
} void init() {
frac[0] = 1ll, frac[1] = 1ll;
for(int i = 2; i <= 100000; i++) frac[i] = 1ll*frac[i - 1] * i % p; return;
} int main() {
ios :: sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> T;
while(T--) {
cin >> n >> m >> p;
init();
cout << lucas(n + m, n) << endl;
} return 0;
}

Lucas 定理简单证明的更多相关文章

  1. xdoj-1057(Lucas定理的证明及其模板)

    Lucas定理的证明: 转自百度百科(感觉写的还不错) 首先你需要这个算式:    ,其中f > 0&& f < p,然后 (1 + x) nΞ(1 + x) sp+q Ξ ...

  2. lucas定理的证明

    http://baike.baidu.com/link?url=jJgkOWPSRMobN7Zk4kIrQAri8m0APxcxP9d-C6qSkIuembQekeRwUoEoBd6bwdidmoCR ...

  3. lucas定理证明

    Lucas 定理(证明) A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])* ...

  4. Lucas定理——定义、证明、实现、运用

    目录 什么是Lucas定理 证明Lucas定理 Lucas定理求解组合数的C++实现 什么是Lucas定理 这是一个有助于分解组合数来求解的定理,适合模数小,数字大的问题. 有质数 \(p\),对于\ ...

  5. 『Lucas定理以及拓展Lucas』

    Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...

  6. Lucas定理学习笔记

    从这里开始 一个有趣的问题 扩展Lucas算法 一个有趣的问题 题目大意 给定$n, m, p$,求$C_{n}^{m}$除以$p$后的余数. Subtask#1  $0\leqslant m\leq ...

  7. 初等数论及其应用——Lucas定理

    Lucas定理用于解决较大组合数的取模问题,下面的理论整理源自冯志刚的<初等数论>,其与百度百科上呈现的Lucas定理形式上不同,但是容易看到二者的转化形式. 首先我们来整理一下冯志刚的& ...

  8. lucas定理 +证明 学习笔记

    lucas定理 p为素数 \[\dbinom n m\equiv\dbinom {n\%p} {m\%p} \dbinom {n/p}{m/p}(mod p)\] 左边一项直接求,右边可递归处理,不包 ...

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

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

  10. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...

随机推荐

  1. [ZJOI2015] 地震后的幻想乡积分题解

    题意: 给定一个无向图,边权为 \([0,1]\) 之间的随机变量.求图最小生成树最大边权的期望. \(n\le 10\). Soluion: Meatherm口诏:我都不知道这个东西怎么想出来的 针 ...

  2. 火爆的 幻兽帕鲁/Palworld 单机➕联机 电脑游戏 免费畅游

    在广阔的世界中收集神奇的生物"帕鲁",派他们进行战斗.建造.做农活,工业生产等,这是一款支持多人游戏模式的全新开放世界生存制作游戏. ▼补丁主要内容 ・修复加载世界数据时,加载画面 ...

  3. 基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结

    前面已经总结了基于Maxmspjitter的相关方法,还有基于Unity的,还有基于Openframeworks的,今天来一篇基于普通软件的: 1.专业播放器类的软件,如Potplayer.vlc.o ...

  4. Python基础笔记-Python基础知识(环境、Python解释器、环境变量、基础语法、数据类型等)

    前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...

  5. C语言 链表操作

    #include<stdio.h>#include<stdlib.h>struct node{    int data;    struct node *next;};int ...

  6. redmine 迁移后邮箱配置

    https://blog.csdn.net/love8753/article/details/126380927 步骤一 修改配置文件 步骤二 redmine 页面配置信息 步骤一 修改配置文件 打开 ...

  7. 谷歌 Chrome 浏览器离线安装 vue devtools 插件

    由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法. 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学. 前 ...

  8. 依赖注入(DI)与控制反转(IoC)

    .wj_nav { display: inline-block; width: 100%; margin-bottom: 0.375rem } .wj_nav span { display: inli ...

  9. [SDR] GNU Radio 系列教程 —— GNU Radio RX PDU (接收据包操作)的基础知识(超全)

    目录 1 接收概述 2 相关块介绍 2.1 相关性估计器(Correlation Estimator) 2.2 多相时钟同步(Polyphase Clock Sync) 2.3 线性均衡器(Linea ...

  10. MySQL中怎么分析性能?

    MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain. 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables lik ...