(Solution:)
用(a,b)表示数,推一推,容易得到题设中的三角形即为
(1)
(a) (b)
(a^2) (2ab) (b^2)
(a^3) (3a^2b) (3ab^2) (a^3)
...
容易看出它就是个帕斯卡三角形,直接组合数一波就没了
证明?自证不难(反正我不会)
其实感性理解起来也是挺显然的嘛(QwQ)。
粗略地证明一下:
如果题目中不含(a,b),则由递推式可知即为帕斯卡三角
再考虑(a,b)的影响:对于(f_{i,j}),(a,b)分别被计算了(n-1,n-m)次,所以答案就是(C_n^ma^{n-1}b^{n-m})
还要注意一下,这道题需要线性求逆元
(Code:)
#include<bits/stdc++.h>
using namespace std;
namespace my_std
{
typedef long long ll;
typedef double db;
const db PI=acos(-1.0);
#define cp complex<db>
#define MP make_pair
#define fir first
#define sec second
#define fr(i,x,y) for(ll i=(x);i<=(y);i++)
#define pfr(i,x,y) for(ll i=(y);i>=(x);i--)
#define gfr(u) for(ll i=head[u];i;i=e[i].nxt)
#define pf prllf
inline ll read()
{
ll sum=0,f=1;
char ch=0;
while(!isdigit(ch))
{
if(ch=='-') f=-1;
ch=getchar();
}
while(isdigit(ch))
{
sum=(sum<<1)+(sum<<3)+(ch^48);
ch=getchar();
}
return sum*f;
}
inline void write(ll x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
}
}
using namespace my_std;
const ll N=1e5+10,mod=1e9+9;
ll t,n,m,a,b,mul[N],inv[N];
inline ll ksmod(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)
{
ans=(ans*a)%mod;
}
a=(a*a)%mod;
b>>=1;
}
return ans;
}
inline 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(void)
{
mul[0]=inv[0]=1;
for(ll i=1;i<=N;i++) mul[i]=mul[i-1]*i%mod;
inv[N]=ksmod(mul[N],mod-2);
for(ll i=N-1;i;i--) inv[i]=inv[i+1]*(i+1)%mod;
t=read();
while(t--)
{
a=read(),b=read(),n=read(),m=read();
write((((C(n-1,m-1)%mod)*ksmod(a,n-m)%mod)*ksmod(b,m-1)%mod)%mod);
putchar('
');
}
return 0;
}