#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, mod = 1e9 + 7;
typedef long long ll;
struct CalC {
ll f[N], inff[N];
ll imp(ll a, ll k, ll q) {
ll res = 1;
while (k) {
if (k & 1) res = res * a % q;
a = a * a % q;
k >>= 1;
}
return res;
}
void init() {
f[0] = inff[0] = 1;
for (int i = 1; i < N; i++) {
f[i] = f[i - 1] * i % mod;
inff[i] = inff[i - 1] * imp(i, mod - 2, mod) % mod;
}
}
ll C(ll a, ll b) {
if (a == b)return 1;
if (a < b)return 0;
return f[a] * inff[b] % mod * inff[a - b] % mod;
}
ll L_C(int a, int b)
{
ll res = 1;
for (ll i = 1, j = a; i <= b; i++, j--)
{
res = res * j % mod;
res = res * imp(i,(ll) mod - 2,mod) % mod;
}
return res;
}
ll lucas(ll a, ll b)
{
if (a < mod && b < mod)
return L_C(a, b);
return
L_C(a % mod, b % mod) * lucas(a / mod, b / mod) % mod;
}
}Cal;
组合数模板
于 2022-08-08 20:37:35 首次发布