对于组合数,往往要用到阶乘,但是阶乘的数据极其之大,所以要用取模的办法防止数据溢出。
而卢卡斯定理在这个时候就有很大的用处了,来看百度百科上的简介。
代码如下 Luogu P3807
#include<bits/stdc++.h> using namespace std; int T; int n,m,p; long long ksm(long long a,long long b,long long p){long long base=1;while(b){if(b&1) base=base*a%p;a=a*a%p;b>>=1;}return base; } long long C(long long n,long long m){if(m>n) return 0;long long a=1,b=1;for(long long i=n-m+1;i<=n;i++){a=a*i%p;}for(long long i=1;i<=m;i++){b=b*i%p;}return a*ksm(b,p-2,p)%p; } long long Lucas(long long n,long long m){if(!m) return 1;else return (C(n%p,m%p)*Lucas(n/p,m/p))%p; } int main(){scanf("%d",&T);for(int i=1;i<=T;i++){scanf("%d%d%d",&n,&m,&p);printf("%lld\n",Lucas(n+m,m));}return 0; }