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)可承受的情况下组合数的计算可以 ...
随机推荐
- [ZJOI2015] 地震后的幻想乡积分题解
题意: 给定一个无向图,边权为 \([0,1]\) 之间的随机变量.求图最小生成树最大边权的期望. \(n\le 10\). Soluion: Meatherm口诏:我都不知道这个东西怎么想出来的 针 ...
- 火爆的 幻兽帕鲁/Palworld 单机➕联机 电脑游戏 免费畅游
在广阔的世界中收集神奇的生物"帕鲁",派他们进行战斗.建造.做农活,工业生产等,这是一款支持多人游戏模式的全新开放世界生存制作游戏. ▼补丁主要内容 ・修复加载世界数据时,加载画面 ...
- 基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结
前面已经总结了基于Maxmspjitter的相关方法,还有基于Unity的,还有基于Openframeworks的,今天来一篇基于普通软件的: 1.专业播放器类的软件,如Potplayer.vlc.o ...
- Python基础笔记-Python基础知识(环境、Python解释器、环境变量、基础语法、数据类型等)
前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...
- C语言 链表操作
#include<stdio.h>#include<stdlib.h>struct node{ int data; struct node *next;};int ...
- redmine 迁移后邮箱配置
https://blog.csdn.net/love8753/article/details/126380927 步骤一 修改配置文件 步骤二 redmine 页面配置信息 步骤一 修改配置文件 打开 ...
- 谷歌 Chrome 浏览器离线安装 vue devtools 插件
由于某些原因,Chrome 应用商店访问不了,所以只能离线安装 vue devtools 插件,离线安装也有两种方法. 方法一:自编译 vue devtools 插件 这方法要求动手能力强的同学. 前 ...
- 依赖注入(DI)与控制反转(IoC)
.wj_nav { display: inline-block; width: 100%; margin-bottom: 0.375rem } .wj_nav span { display: inli ...
- [SDR] GNU Radio 系列教程 —— GNU Radio RX PDU (接收据包操作)的基础知识(超全)
目录 1 接收概述 2 相关块介绍 2.1 相关性估计器(Correlation Estimator) 2.2 多相时钟同步(Polyphase Clock Sync) 2.3 线性均衡器(Linea ...
- MySQL中怎么分析性能?
MySQL中主要有4种方式可以分析数据库性能,分别是慢查询日志,profile,Com_xxx和explain. 慢查询日志 先用下面命令查询慢查询日志是否开启, show variables lik ...