Lucas定理笔记

Q:有什么作用?
处理组合数取模.
也就是求 CnmC^m_n mod pp的值

Code(lgojP3807):

#include <bits/stdc++.h>
#define N 100010
#define ll long long
using namespace std;
ll a[N];
int p;

inline void read(int &x) {
	char ch=getchar();
	while (ch<'0' || ch>'9') {
		ch=getchar();
	}
	for (x=0; ch>='0' && ch<='9'; ch=getchar()) {
		x=(x << 1)+(x << 3)+ch-'0';
	}
}

inline ll pow(ll y, int z, int p) {
	ll ans=1;
	y%=p;
	for (int i=z; i; i>>=1, y=y*y%p) {
		if (i & 1) {
			ans*=y;
			ans%=p;
		}
	}
	
	return ans;
}
inline ll C(ll n, ll m) {
	if (m>n) {
		return 0;
	}
	
	return ((a[n]*pow(a[m], p-2, p))%p*pow(a[n-m], p-2, p)%p);
}
inline ll Lucas(ll n, ll m){
	if (!m) {
		return 1;
	}
	
	return C(n%p, m%p)*Lucas(n/p, m/p)%p;
}

int main() {
	int T;
	read(T);
	while (T--) {
		int n, m;
		read(n); read(m); read(p);
		a[0]=1;
		for (register int i=1; i<=p; i++) {
			a[i]=(a[i-1]*i)%p;
		}
		cout << Lucas(n+m, n) << endl;
	}
}
posted @ 2020-07-15 21:44  willbe233  阅读(54)  评论(0)    收藏  举报