Lucas 定理简单证明
前言
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\),有:
\]
引理 1
\]
证明引理 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
\]
证明引理 2:
先二项式定理展开有
\]
由引理 1,上式只有 \(n=0\vee n=p\) 时有值,即
\]
证明Lucas 定理
不妨把 \({n\choose m}\bmod p\) 看做是 \((1+x)^n\bmod p\) 在 \(x^m\) 项的系数。
由 \(n=p\lfloor n/p\rfloor+n\bmod p\) 先把指数拆成两部分
\]
由引理 2,\((1+x)^{p\lfloor n/p\rfloor}=(1+x^p)^{\lfloor n/p\rfloor}\),即
\]
再二项式定理展开,有
\]
那么 \(x^m\) 项系数的另一种表达方式就有
\]
不难验证 \(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\) 就是其唯一的一组合法解。也就是说上式就等于
\]
也就得到
\]
得证。
模板代码
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 定理简单证明的更多相关文章
- xdoj-1057(Lucas定理的证明及其模板)
Lucas定理的证明: 转自百度百科(感觉写的还不错) 首先你需要这个算式: ,其中f > 0&& f < p,然后 (1 + x) nΞ(1 + x) sp+q Ξ ...
- lucas定理的证明
http://baike.baidu.com/link?url=jJgkOWPSRMobN7Zk4kIrQAri8m0APxcxP9d-C6qSkIuembQekeRwUoEoBd6bwdidmoCR ...
- 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])* ...
- Lucas定理——定义、证明、实现、运用
目录 什么是Lucas定理 证明Lucas定理 Lucas定理求解组合数的C++实现 什么是Lucas定理 这是一个有助于分解组合数来求解的定理,适合模数小,数字大的问题. 有质数 \(p\),对于\ ...
- 『Lucas定理以及拓展Lucas』
Lucas定理 在『组合数学基础』中,我们已经提出了\(Lucas\)定理,并给出了\(Lucas\)定理的证明,本文仅将简单回顾,并给出代码. \(Lucas\)定理:当\(p\)为质数时,\(C_ ...
- Lucas定理学习笔记
从这里开始 一个有趣的问题 扩展Lucas算法 一个有趣的问题 题目大意 给定$n, m, p$,求$C_{n}^{m}$除以$p$后的余数. Subtask#1 $0\leqslant m\leq ...
- 初等数论及其应用——Lucas定理
Lucas定理用于解决较大组合数的取模问题,下面的理论整理源自冯志刚的<初等数论>,其与百度百科上呈现的Lucas定理形式上不同,但是容易看到二者的转化形式. 首先我们来整理一下冯志刚的& ...
- lucas定理 +证明 学习笔记
lucas定理 p为素数 \[\dbinom n m\equiv\dbinom {n\%p} {m\%p} \dbinom {n/p}{m/p}(mod p)\] 左边一项直接求,右边可递归处理,不包 ...
- 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)
[模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...
- 组合数取模Lucas定理及快速幂取模
组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1) , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...
随机推荐
- Python 数
Python 数 在Python中,数字是编程中不可或缺的一部分.Python支持多种类型的数字,包括整数.浮点数等.下面我们将详细介绍这些数字类型以及它们之间的运算和格式化. 整数 整数是Pytho ...
- vue-element-admin改为从后台获取菜单
一.修改文件\src\router\index.js 文件的asyncRoutes清理为 export const asyncRoutes = [ { path: '*', redirect: '/4 ...
- K230学习记录
K230学习记录 参考自: # 立创·庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源 # 开发板官网:www.lckfb.com # 技术支持常驻论坛,任何技术问题欢迎随时交 ...
- 八米云-N1盒子、S905系列机顶盒等设备-小白保姆式超详细刷机教程
线刷准备 这里以魔百盒CM211-1为例,本次刷机用到的零碎工具比较多,不过都是常见刚需设备,大家可以按照清单核对一下. 目前只支持S905 L3.L3a.L2 系列的各种盒子 机顶盒本体 电脑一台 ...
- 有关算法与数据结构的考题解答参考汇总 [C++] [链表] · 第三篇
早先年考研的主考科目正是[算法与数据结构],复习得还算可以.也在当时[百度知道]上回答了许多相关问题,现把他们一起汇总整理一下,供读者参考. [1] 原题目地址:https://zhidao.baid ...
- springboot 2.1.6.RELEASE整合Swagger2
一.引入依赖 1 <modelVersion>4.0.0</modelVersion> 2 <groupId>com.badcat</groupId> ...
- Visual Studio 好用的主题+字体推荐!!!
Vs2022主题+字体 Visual Studio(VS)是一款功能强大的集成开发环境(IDE),可以用于开发各种类型的应用程序,包括桌面应用.Web应用.移动应用等.它提供了许多主题设置和字体选项, ...
- ISCSI数据盘的多路径配置
本文分享自天翼云开发者社区<ISCSI数据盘的多路径配置>,作者:w****n 多路径出现的背景 多路径,就是说,主机到存储可以有多条路径可以选择.主机到存储之间的IO由多条路径可以选择. ...
- 自己写的第一个java项目!
项目名为"零钱通" 细节参考 [零基础 快速学Java]韩顺平 零基础30天学会Java 基本版: 1 package project; 2 3 import java.text. ...
- 题解:CF2077B Finding OR Sum
本文发布于博客园和洛谷,若您在其他平台阅读到此文,请前往博客园获得更好的阅读体验. 跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18771334 ...