abc156D 带朵数限制的不同扎花方案数

94 阅读1分钟

题面:stk有n种花,每种各1朵,需要从中选出1种或多种来扎成花束,要求花的朵数不能是a或b,问可以制作多少种不同的花束?结果对1E9+7取模。

范围:2 <= n <= 1E9; 1 <= a < b <= min(n,2E5)

分析:每朵花都有选与不选两种情况,去掉都不选的情况,共2^n-1种方案,然后减掉选a种和选b种的情况,方案数分别为C(n,a)和C(n,b),这里n比较大,要用定义算。

#include <bits/stdc++.h>
// mint模板略
mint comb(int n, int k) {
    mint r = 1;
    for (int i = 1; i <= k; i++) r *= n - i + 1;
    for (int i = 1; i <= k; i++) r /= i;
    return r;
}
void solve() {
    int n, a, b;
    std::cin >> n >> a >> b;
    mint ans = mint::power(2, n) - 1;
    ans -= comb(n, a);
    ans -= comb(n, b);
    std::cout << ans << "\n";
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:组合数学