AT5341 [ABC156D] Bouquet 题解

Content

有一个人有 \(n\) 种不同的话可供选择,TA 可以选择至少一种花做花束,但是 TA 不喜欢花的种数为 \(a\) 或者 \(b\) 的花束。求选花的方案数对 \(10^9+7\) 取模。

数据范围:\(2\leqslant n\leqslant 10^9\)\(1\leqslant a<b\leqslant\min\{n,2\times 10^5\}\)

Solution

简单的数数题。

我们先抛开『TA 不喜欢花的种数为 \(a\) 或者 \(b\) 的花束』这个条件不管,先来看如果是从 \(n\) 种花中选至少一种花作为花束的方案数。很显然,每种花都有『选』或者『不选』这两种状态,那么就一共有 \(2^n\) 种方案。但是又不能全部都不选,于是最终方案总数为 \(2^n-1\)

我们再来看看不选种数为 \(a\) 或者 \(b\) 的方案总数。根据组合数的定义,我们可以很快求出选花的种数为 \(a\) 的方案总数为 \(C_n^a\)选花的种数为 \(b\) 的方案总数为 \(C_n^b\),又因为题目保证 \(a\neq b\),因此选花的种数为 \(a\) 或者 \(b\) 的方案总数为 \(C_n^a+C_n^b\)

那么,最终的答案就呼之欲出了,为 \(2^n-1-C_n^a-C_n^b\)

那么我们该如何求出答案呢?

首先,\(2^n\) 这个部分非常好办,直接上快速幂即可。

再然后就是组合数了。我们不妨先看到费马小定理乘法逆元的定义。

  • 费马小定理:如果 \(p\) 是质数,则对于任意整数 \(a\),都有 \(a^p\equiv a\pmod p\),或者 \(a^{p-1}\equiv 1\pmod p\)
  • 乘法逆元:如果 \(b,p\) 互质,且 \(b\mid a\),则我们存在一个整数 \(x\),使得 \(\dfrac ab\equiv a\cdot x\pmod p\)

有了这两个东西,我们可以推导出 \(a\times a^{p-2}\equiv 1\pmod p\),从而在计算组合数的时候就不用除一个数 \(x\),直接乘上 \(x^{p-2}\) 即可达到相同的效果。

回到求组合数,由于 \(C_n^m=\dfrac{n!}{m!((n-m)!}=\dfrac{\prod\limits_{i=n-m+1}^ni}{m!}\),因此我们可以分两部分暴力去算出分子 \(a\) 和分母 \(b\),组合数就是 \(a\times b^{mod-2}\)

这道题目就算做完了。

Code

const int N = 2e5 + 7, mod = 1e9 + 7;

ii ksm(int a, int b) {
	int res = 1;
	for(; b; b >>= 1, a = 1ll * a * a % mod) if(b % 2) res = 1ll * res * a % mod;
	return res;
}
ii C(int n, int m) {
	if(n < m || n < 0 || m < 0) return 0;
	int res1 = 1, res2 = 1;
	R(int, i, n, n - m + 1) res1 = 1ll * res1 * i % mod;
	R(int, i, m, 1) res2 = 1ll * res2 * i % mod;
	return 1ll * res1 * ksm(res2, mod - 2) % mod;
}

int main() {
	int n = Rint, a = Rint, b = Rint, ans = ksm(2, n) % mod;
	ans = (((ans - C(n, a) + mod) % mod -  C(n, b) + mod) % mod - 1 + mod) % mod;
	return println(ans), 0;
}
posted @ 2021-12-15 21:37  Eason_AC  阅读(52)  评论(0)    收藏  举报