组合数取模
组合数取模:
求1e18范围的组合数取模:
卢卡斯定理: \(\tbinom{m}{n} \equiv \tbinom{m\mod p}{n\mod p}\tbinom{m/p}{n/p}\mod p\)
求\(i\mod p\)逆元: 解不定方程组\(i(inv)+py = gcd(i, p)=1\)
code:
#include<cstdio>
typedef long long ll;
const ll p = 1e6 + 3;
inline void exgcd(ll a, ll b, ll& x, ll& y) {
if (!b) {
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
}
inline ll Combination(ll n, ll m) {
ll c = 1;
if (m < p) {
for (ll i = 1; i <= m; ++i) {
ll inv, t;
exgcd(i, p, inv, t);
c = c * (n - i + 1) % p * inv % p;
}
return c;
}
return Combination(n / p, m / p)* Combination(n % p, m % p) % p;
}
int main() {
ll n, m;
scanf("%lld%lld", &n, &m);
ll ans = Combination(n, m);
if (ans < 0)ans += p;
printf("%lld\n", ans);
}