Lucas定理笔记
Q:有什么作用?
处理组合数取模.
也就是求 mod 的值
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;
}
}

浙公网安备 33010602011771号