Lucas卢卡斯定理
当$p$为素数时
$$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$$
设$n=s*p+q,m\equiv t*p+r(q,r<=p)$
我们要证$C_{s*p+q}^{t*p+r}\equiv C_s^t*C_q^r$
首先得有个前置知识,费马小定理$x^p\equiv x(mod\ p)$
那么$(x+1)^p\equiv x+1(mod\ p)$
且$x^p+1\equiv x+1(mod\ p)$
所以$(x+1)^p\equiv x^p+1$
然后$(x+1)^n\equiv (x+1)^{s*p+q}$
$\equiv ((x+1)^p)^s*(x+1)^q$
$\equiv (x^p+1)^s*(x+1)^q$
然后用二项式定理展开
$\equiv \sum _{i=0}^s C_s^i*x^{i*p}*\sum_{j=0}^qC_q^j*x^j$
总之就是$(x+1)^p\equiv \sum _{i=0}^s C_s^i*x^{i*p}*\sum_{j=0}^qC_q^j*x^j$
然后考虑把两边的多项式展开一下
那么两边肯定都有$x^m$即$x^{t*p+r}$这一项(这是最上面的假设)
左边的$x^m$的系数,根据上面的性质4推出来,应该是$C_n^m$
然后右边嘞?只有$i=t,j=r$的时候才会有这一项,所以这一项的系数就是$C_s^t*C_q^r$
然后又因为$s=n/p,t=n\%p,q=m/p,r=m\%p$
然后就能证明$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$
然而万一$q<r$该怎么办?那样的话$j$根本不可能等于$r$啊?
所以那样的话答案就是$0$
因为上面乘上$C_{n\%p}^{m\%p}$答案就是$0$
如何证明?
我们设$f=n-m=z*p+x$
因为$r>t,x+r\equiv t(mod\ p)$
所以$x+r=p+t$
又因为$z*p+x+q*p+r=s*p+t$
所以$z+q=s-1$
那么带进通项公式$C_n^m=\frac {n!}{m!*f!}$之后,分子中有$s$个$p$的倍数(不考虑有$p^2$之类的,因为下面有的话上面肯定也有),分母中有$s-1$个$p$的倍数,抵消之后分子中还有一个$p$,那么这个数就是$p$的倍数,模$p$肯定余$0$啦
累死我了……
// luogu-judger-enable-o2
//minamoto
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline ll read(){
#define num ch-'0'
char ch;bool flag=;ll res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
ll n,m,p;
ll fac[N],inv[N];
void init(){
fac[]=;
for(int i=;i<=p;++i)
fac[i]=fac[i-]*i%p;
}
ll qpow(ll a,ll b){
ll res=;
while(b){
if(b&) res=res*a%p;
b>>=,a=a*a%p;
}
return res;
}
ll C(ll n,ll m){
if(m>n) return ;
return fac[n]*qpow(fac[m]*fac[n-m],p-)%p;
}
ll Lucas(ll n,ll m){
if(m==) return ;
return Lucas(n/p,m/p)*C(n%p,m%p)%p;
}
int main(){
int T=read();
while(T--){
n=read(),m=read(),p=read();
init();
printf("%lld\n",Lucas(m+n,m));
}
return ;
}
Lucas卢卡斯定理的更多相关文章
- Lucas 卢卡斯定理
Lucas: 卢卡斯定理说白了只有一条性质 $$ C^n_m \equiv C^{n/p}_{m/p} \times C^{n \bmod p}_{m \bmod p} \ (mod \ \ p) $ ...
- CRT中国剩余定理 & Lucas卢卡斯定理
数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...
- Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)
Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...
- Lucas(卢卡斯)定理
公式 $$C_n^m\%p=C_{n/p}^{m/p}*C_{n\%p}^{m\%p}\%p~~(p为素数)$$ 代码如下 typedef long long ll; ll mod_pow(ll x, ...
- 卢卡斯定理 Lucas (p为素数)
证明摘自:(我网上唯一看得懂的证明) https://blog.csdn.net/alan_cty/article/details/54318369 结论:(显然递归实现)lucas(n,m)=luc ...
- 卢卡斯定理Lucas
卢卡斯定理Lucas 在数论中,\(Lucas\)定理用于快速计算\(C^m_n ~ \% ~p\),即证明\(C^m_n = \prod_{i = 0} ^kC^{m_i}_{n_i}\)其中\(m ...
- 数论篇7——组合数 & 卢卡斯定理(Lucas)
组合数 组合数就是高中排列组合的知识,求解组合数C(n,m),即从n个相同物品中取出m个的方案数. 求解方式 求解通式:$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\righ ...
- Lucas(卢卡斯)定理
Lucas定理 对于C(m,n)%P(P是质数)这样的问题,可以通过预处理阶乘和阶乘的逆元,来快速计算.但是当m,n大于P时,就不能保证m,n与P互质了,但不互质的情况下,乘法逆元不存在,此时就需要卢 ...
- 【luogu P3807】【模板】卢卡斯定理/Lucas 定理(含 Lucas 定理证明)
[模板]卢卡斯定理/Lucas 定理 题目链接:luogu P3807 题目大意 求 C(n,n+m)%p 的值. p 保证是质数. 思路 Lucas 定理内容 对于非负整数 \(n\),\(m\), ...
随机推荐
- luogu3646 巴厘岛的雕塑 (dp)
我们一位一位地来做,每次判断这一位能否放0,而且要在满足前几位的情况下.用dp来判断 具体来说,设f[i][j]表示前i个划分成j个区间能否满足,那么我们会有转移trans[i][k+1],当区间[i ...
- MATLAB:图像水平、垂直、水平垂直镜像、转置、旋转变换(flipdim、mirror、transp、imrotate函数)
1.原图像经水平.垂直.水平垂直镜像设置通过mirror函数实现: close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear all; clc; I=imrea ...
- powerdesigner 字段添加注释和默认值
powerdesigner 字段添加注释和默认值 2017年01月06日 10:59:02 qingzhuoran 阅读数:27161更多 个人分类: powerdesigner 1.选中表,右键 ...
- 【清北学堂2018-刷题冲刺】Contest 9
前几天本蒟蒻一直在颓废所以这篇题解咕了很久,而且最后一个题目不太会,最终也没完成,非常惭愧. 写这些题目收获相当大.后面的日子呢,我会继续着手刷NOIP题目和Codeforces题目. 到这里就 ...
- sizeof 与 字节对齐
转:http://baike.baidu.com/view/1356720.htm sizeof是运算符,可用于任何变量名.类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号. ...
- mac java jdk 安装删除
安装: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载安装双击安装 卸载: ...
- 类的内置方法__attr__介绍
1.hasattr getaddr setaddr delattr 这四个函数同样也适用于类 class BlackMedium: feture="Ugly" def __in ...
- 数据分析工具urule
Python统计学书籍 https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-13911786811.22.6431353b4F5iw1& ...
- spring-data-jpa初步认识
什么是spring data jpa? spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的[方法命名规则]写dao层接口,就可以在不写接口实现的情况下,实现对数据 ...
- django错误笔记——TypeError: view must be a callable or a list/tuple in the case of include().解决办法
django增加用户认证模块时,总是提醒模块的url.py中 url(r'^login/$', 'django.contrib.auth.views.login', name='login'),出错: ...