Lucas定理 mod小于10^5
namespace Lucas
{
inline long long qpow(long long a, long long x, long long mod)
{
long long res = 1;
while (x)
{
if (x & 1) res = (res * a) % mod;
a = (a * a) % mod;
x >>= 1;
}
return res;
}
inline long long C(long long n, long long m, long long mod)
{
if (n < m)
return 0;
if (m > n - m)
m = n - m;
long long a = 1, b = 1;
for (int i = 0; i < m; i++)
{
a = a * (n - i) % mod;
b = b * (i + 1) % mod;
}
return a * qpow(b, mod - 2, mod) % mod;
}
long long lucas(long long a, long long b, long long mod)
{
if (b == 0) return 1;
return C(a % mod, b % mod, mod) * lucas(a / mod, b / mod, mod) % mod;
}
}
逆元求组合数
namespace C
{
const long long maxn = 100005;
long long p[maxn], inv[maxn];
inline long long qpow(long long a, long long b, long long mod)
{
long long ans = 1;
while (b)
{
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans;
}
inline void init(long long mod)
{
p[0] = 1;
for (long long i = 1; i < maxn; i++) p[i] = p[i - 1] * i % mod;
inv[maxn - 1] = qpow(p[maxn - 1], mod - 2, mod);
for (int i = maxn - 1; i > 0; --i) inv[i - 1] = inv[i] * i % mod;
}
inline long long C(int a, int b, long long mod)
{
if (a == b)
return 1;
else if (a < 0 || b < 0 || a < b)
return 0;
else
return p[a] * inv[b] % mod * inv[a - b] % mod;
}
}
网友评论