当$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卢卡斯定理的更多相关文章

  1. Lucas 卢卡斯定理

    Lucas: 卢卡斯定理说白了只有一条性质 $$ C^n_m \equiv C^{n/p}_{m/p} \times C^{n \bmod p}_{m \bmod p} \ (mod \ \ p) $ ...

  2. CRT中国剩余定理 & Lucas卢卡斯定理

    数论_CRT(中国剩余定理)& Lucas (卢卡斯定理) 前言 又是一脸懵逼的一天. 正文 按照道理来说,我们应该先做一个介绍. 中国剩余定理 中国剩余定理,Chinese Remainde ...

  3. Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)

    Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...

  4. 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, ...

  5. 卢卡斯定理 Lucas (p为素数)

    证明摘自:(我网上唯一看得懂的证明) https://blog.csdn.net/alan_cty/article/details/54318369 结论:(显然递归实现)lucas(n,m)=luc ...

  6. 卢卡斯定理Lucas

    卢卡斯定理Lucas 在数论中,\(Lucas\)定理用于快速计算\(C^m_n ~ \% ~p\),即证明\(C^m_n = \prod_{i = 0} ^kC^{m_i}_{n_i}\)其中\(m ...

  7. 数论篇7——组合数 & 卢卡斯定理(Lucas)

    组合数 组合数就是高中排列组合的知识,求解组合数C(n,m),即从n个相同物品中取出m个的方案数. 求解方式 求解通式:$C^{m}_{n}=\dfrac {n!}{m!\left( n-m\righ ...

  8. Lucas(卢卡斯)定理

    Lucas定理 对于C(m,n)%P(P是质数)这样的问题,可以通过预处理阶乘和阶乘的逆元,来快速计算.但是当m,n大于P时,就不能保证m,n与P互质了,但不互质的情况下,乘法逆元不存在,此时就需要卢 ...

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

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

随机推荐

  1. 【bzoj2229】 Zjoi2011—最小割

    http://www.lydsy.com/JudgeOnline/problem.php?id=2229 (题目链接) 题意 给出一张无向图,$q$组询问,每次询问最小割不大于$c$的点对数量. So ...

  2. 2018 ACM 网络选拔赛 北京赛区

    A Saving Tang Monk II #include <bits/stdc++.h> using namespace std; ; struct node { int x,y,z, ...

  3. (string find) 亲和串 hdu2203

    亲和串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  4. JQ版本对比

    JQ不知不觉来到第三版了,那么它们有什么不同呢? 下面先给大家推一个CDN加速的网站,上面有各种JQ的版本:http://www.bootcdn.cn/jquery/ 先来对比一下它们的“体重”,23 ...

  5. 1021. Deepest Root (25)

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  6. Hadoop基础-Hdfs各个组件的运行原理介绍

    Hadoop基础-Hdfs各个组件的运行原理介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.NameNode工作原理(默认端口号:50070) 1>.什么是NameN ...

  7. 学习windows编程 day2 之滚动条使用

    相关函数: setscrollrange,setscrollpos,getscrollrange,getscrollpos 使用滚动条时我们需要进行的操作: 1.初始化滚动条范围和位置 在窗口创建时W ...

  8. vue切换路由页面内容没有重载

    项目中遇到这样一个问题: 在一个地方填了一个申请的表单,需要在另一个页面的列表上显示出来这条申请的数据,但是由于vue的缓存,在切换路由时列表上并没有及时更新数据,解决方法如下: vue路由切换时页面 ...

  9. Git与GitHub学习笔记(五)一次提交失败的记录

    代码已经跟踪了,添加注释说明,但是总是添加不了 error: pathspec 'live-page'' did not match any file(s) known to git. 重复了好多遍, ...

  10. JavaWeb应用和Servlet

    JavaWeb应用的生命周期是由Servlet容器来控制的.包括三个阶段: 1.启动阶段:加载Web应用的有关数据,创建ServletContest对象,对Filter(过滤器)和一些Servlet进 ...