卢卡斯定理
一行代码搞定,是用来求大组合数取小模的
注意:不要把全局变量p覆盖了,覆盖就炸了。还有,0的阶乘等于1啊,fac[0]=1啊,别忘了。
https://www.luogu.org/problemnew/show/P3807
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
int p;
ll fac[maxn];
ll quickpow(ll x, int k)
{
ll res = 1;
while (k){
if (k & 1) res = res * x % p;
x = x * x % p;
k >>= 1;
}
return res;
}
ll C(ll n, ll m){return n < m ? 0 : fac[n] * quickpow((fac[m] * fac[n - m]) % p, p - 2) % p;}
ll lucas(ll n, ll m){return m == 0 ? 1LL : C(n % p, m % p) * lucas(n / p, m / p) % p;}
int main()
{
//ios::sync_with_stdio(0); cin.tie(0);
fac[0] = 1;
int t;
cin >> t;
while (t--){
int n, m;
cin >> n >> m >> p;
for (int i = 1; i <= n + m; ++i) fac[i] = (ll)i * fac[i - 1] % p;
cout << lucas(n + m, m) << endl;
}
return 0;
}