这个题没有 (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
", ans);
}
return 0;
}