组合数取模

组合数取模:

求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);
}
posted @ 2021-03-12 22:01  _dwt  阅读(36)  评论(0)    收藏  举报