noi.ac #65 triangle

这个题没有 \(a\), \(b\) 的时候就是一个简单的组合数。

现在加上 \(a\), \(b\) 好像还是个组合数^^

其实,找找规律就可以知道,对第 \(n\)\(m\) 列的数,\(a\) 被计算了 \(n-m\) 次,\(b\) 被计算了 \(m-1\) 次。

但是这题的数据要求线性求逆元,反正我会。。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 1e5 + 10;
const int mod = 1e9 + 9;
ll t, n, m, a, b;
ll mul[N], inv[N];
template<class I>
inline void rd(I &x) {
    ll f = 1;
    char c = getchar();
    for(; c < '0' || c > '9'; c = getchar()) if(c == '-') f = -1;
    for(x = 0; c >= '0' && c <= '9'; x = (x << 3) + (x << 1) + (c & 15), c = getchar());
    x *= f;
}
ll ksm(ll a, ll b) {
    ll res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
ll C(ll n, ll m) {
    if (m > n) return 0;
    ll res = inv[m] * inv[n-m] % mod;
    res = res * mul[n] % mod;
    return res;
}
int main() {
    mul[0] = inv[0] = 1;
    for (ll i = 1; i <= N; i++) mul[i] = mul[i - 1] * i % mod;
    inv[N] = ksm(mul[N], mod - 2);
    for (ll i = N - 1; i; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
    rd(t);
    while (t--) {
        rd(a), rd(b), rd(n), rd(m);
        ll ans = C(n - 1, m - 1);
        ans = ans * ksm(a, n - m) % mod;
        ans = ans * ksm(b, m - 1) % mod;
        printf("%d\n", ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/11haonb/p/11620155.html