【模板】卢卡斯定理
2017-10-25 20:31
204 查看
题目描述
给定n,m,p(1≤n,m,p≤1051\le n,m,p\le 10^51≤n,m,p≤105)求 Cn+mm mod pC_{n+m}^{m}\ mod\ pCn+mm mod p
保证P为prime
C表示组合数。
一个测试点内包含多组数据。
输入输出格式
输入格式:第一行一个整数T(T≤10T\le 10T≤10),表示数据组数
第二行开始共T行,每行三个数n m p,意义如上
输出格式:
共T行,每行一个整数表示答案。
输入输出样例
输入样例#1: 复制2 1 2 5 2 1 5
输出样例#1: 复制
3 3
思路
卢卡斯定理;C(m,n)%p=C(m/p,n/p)*C(m%p,n%p)%p;
代码
#include<cstdio> const int maxn=1e5+10; int T,n,m,p; int f[maxn]={1}; void init(){for(int i=1;i<=p;i++) f[i]=(1ll*f[i-1]*i)%p;} int FP(int x,int y){ int ret=1; while(y){ if(y&1) ret=(1ll*ret*x)%p; y>>=1,x=(1ll*x*x)%p; } return ret; } int IE(int x){return FP(x,p-2);} int C(int m,int n){ if(m>n) return 0; return 1ll*f *IE(f[n-m])%p*IE(f[m])%p; } int Lucas(int m,int n){ if(!m) return 1; return 1ll*Lucas(m/p,n/p)*C(m%p,n%p)%p; } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&p); init(); printf("%d\n",Lucas(m,n+m)%p); } return 0; }
相关文章推荐
- 卢卡斯定理模板(当n和m很大,p为素数时)
- 组合数模板+ 卢卡斯定理
- luogu P3807 【模板】卢卡斯定理
- 洛谷 P3807 【模板】卢卡斯定理
- 【Luogu3807】【模板】卢卡斯定理(数论)
- 卢卡斯定理的模板以及应用
- 洛谷.3807.[模板]卢卡斯定理(Lucas)
- [模板]-卢卡斯(Lucas)定理
- [Luogu 3807]【模板】卢卡斯定理
- 【洛谷】3807 【模板】卢卡斯定理
- 洛谷—— P3807 【模板】卢卡斯定理
- [模板] 卢卡斯定理
- 洛谷P3807 【模板】卢卡斯定理exgcd
- 组合数取模(卢卡斯定理、模板)
- 【数论】Lucas定理推导过程+模板
- 扩展中国剩余定理模板
- poj 1006 中国剩余定理模板
- 【整合】矩阵树定理模板
- HDU -- 4135 Co-prime【质因子分解+状压 + 容斥定理】+ 模板
- 【学习笔记】卢卡斯定理