前言

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. 4.vue Router路由设置

    router=>index.js 设置路由信息 1.路由文件按分组拆分多个 import analysisRouter from './analysisRouter'; import users ...

  2. 开源一款串口舵机驱动扩展板-FreakStudio多米诺系列

    原文链接: FreakStudio的博客 摘要 总线舵机扩展板通过UART接口控制多个舵机,支持堆叠级联,最多连接4个扩展板.具备小尺寸设计.供电保护.全双工转半双工通信.稳定供电等特点,适用于多舵机 ...

  3. 13. MySQL 事务基础知识(详细说明实操剖析)

    13. MySQL 事务基础知识(详细说明实操剖析) @ 目录 13. MySQL 事务基础知识(详细说明实操剖析) 1. 数据库事务概述 1.1 存储引擎支持情况 1.2 事务基本概念 1.3 事务 ...

  4. 文件快递柜FileCoxBox-匿名口令分享文本,文件,像拿快递一样取文件

    FileCoxBox特色 轻量简洁:Fastapi+Sqlite3+Vue2+ElementUI 轻松上传:复制粘贴,拖拽选择 多种类型:文本,文件 防止爆破:错误次数限制 防止滥用:IP限制上传次数 ...

  5. Python异步编程进阶指南:破解高并发系统的七重封印

    title: Python异步编程进阶指南:破解高并发系统的七重封印 date: 2025/2/25 updated: 2025/2/25 author: cmdragon excerpt: 本文是异 ...

  6. 大数据之路Week08_day06 (Zookeeper初识)

    让我们来回顾一下我们在学习Hadoop中的HDFS的时候,肯定见过下面这样的两幅图: 这副图代表着什么呢?它介绍的是Hadoop集群的高可靠,也就是前面提过的HA,仔细观察一下这副图,我们发现有两个N ...

  7. oauth2.0 判断接口是否允许跨域

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Web前端入门第 8 问:HTML <!DOCTYPE> 申明有何用处?如果没有此申明有什么问题?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 先电脑端浏览器打开任何一个网页,比如百度. 再用 ctrl + u 快捷键即可查看源码,瞅瞅第一行代码,是不是都 ...

  9. angular双向数据绑定踩坑记:

    在angular中使用ngModel时出现了一个报错error NG8002: Can't bind to 'ngModel' since it isn't a known property of ' ...

  10. 鸿蒙开发 HarmonyOS DevEco Studio 常用快捷键

    前言 做 HarmonyOS 鸿蒙开发离不开 DevEco Studio 开发工具, DevEco Studio 是基于 IntelliJ IDEA Community 开源版本打造,所以默认的快捷键 ...