【Luogu3807】【模板】卢卡斯定理(数论)
2017-11-08 19:13
363 查看
题目描述
给定n,m,p(1≤n,m,p≤105)求 Cmn+mmodp
保证P为prime
C表示组合数。
一个测试点内包含多组数据。
输入输出格式
输入格式:第一行一个整数T(T≤10),表示数据组数
第二行开始共T行,每行三个数nmp,意义如上
输出格式:
共T行,每行一个整数表示答案。
输入输出样例
输入样例#1:2
1 2 5
2 1 5
输出样例#1:
3
3
题解
卢卡斯定理模板题卢卡斯定理:
Cnm≡Cn/pm/p∗Cn%pm%p(modp)
当n,m很大,而P很小的使用
递归计算即可
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define ll long long ll n,m,P; ll jc[100100]; inline int read() { int x=0,t=1;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=-1,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return x*t; } ll Pow(ll a,ll b) { ll s=1; while(b) { if(b&1)s=1ll*s*a%P; a=a*1ll*a%P; b>>=1; } return s; } ll C(ll n,ll m) { if(m>n)return 0; return jc *Pow(jc[m]*jc[n-m]%P,P-2)%P; } ll Lucas(ll n,ll m) { if(m==0)return 1; return (Lucas(n/P,m/P)*C(n%P,m%P))%P; } int main() { int T=read(); while(T--) { jc[0]=1; n=read();m=read();P=read(); for(int i=1;i<=P;++i)jc[i]=jc[i-1]*1ll*i%P; printf("%lld\n",Lucas(n+m,m)%P); } return 0; }
相关文章推荐
- [Luogu 3807]【模板】卢卡斯定理
- hdu5698百度之星瞬间移动(数论/卢卡斯定理)
- 【模板】卢卡斯定理
- 洛谷.3807.[模板]卢卡斯定理(Lucas)
- [模板] 卢卡斯定理
- [模板]-卢卡斯(Lucas)定理
- luogu P3807 【模板】卢卡斯定理
- ACM数论之旅10---大组合数-卢卡斯定理(在下卢卡斯,你是我的Master吗?(。-`ω´-) )
- 数论——Lucas定理模板
- 洛谷P3807 【模板】卢卡斯定理exgcd
- 卢卡斯定理模板(当n和m很大,p为素数时)
- 数论-Lucas(卢卡斯定理)
- 洛谷—— P3807 【模板】卢卡斯定理
- 数论-Lucas(卢卡斯定理)
- 【洛谷】3807 【模板】卢卡斯定理
- 卢卡斯定理的模板以及应用
- 【数论定理】卢卡斯定理
- 组合数取模(卢卡斯定理、模板)
- HDU3037——Saving Beans(数论,组合数取模,lucas定理模板)
- 【数论】Lucas定理推导过程+模板