题目:
https://ac.nowcoder.com/acm/problem/15251
已知
f
(
1
,
1
)
=
1
f(1,1)=1
f(1,1)=1,有
f
(
i
,
j
)
=
a
∗
f
(
i
−
1
,
j
)
+
b
∗
f
(
i
−
1
,
j
−
1
)
i
≥
2
,
1
≤
j
≤
i
f(i,j)=a*f(i-1,j)+b*f(i-1,j-1)\quad i\ge 2,1\le j\le i
f(i,j)=a∗f(i−1,j)+b∗f(i−1,j−1)i≥2,1≤j≤i对于其他情况
f
(
i
,
j
)
=
0
f(i,j)=0
f(i,j)=0
有
T
T
T组询问,每次给出
a
,
b
,
n
,
m
a,b,n,m
a,b,n,m,求
f
(
n
,
m
)
m
o
d
(
998244353
)
f(n,m) mod (998244353)
f(n,m)mod(998244353)
思路:
类似Problem F: Frightful Formula,只不过变成了往下往右下走,初始位置在
(
1
,
1
)
(1,1)
(1,1),则方案数就是
(
n
−
1
m
−
1
)
{n-1\choose m-1}
(m−1n−1)。所以
f
(
1
,
1
)
f(1,1)
f(1,1)的贡献就是
b
m
−
1
a
n
−
m
(
n
−
1
m
−
1
)
b^{m-1}a^{n-m}{n-1\choose m-1}
bm−1an−m(m−1n−1)。
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
const int N=100009;
int T;
ll p[N],p1[N];
ll qpow(ll a,ll b) {
ll res=1;
a%=mod;
while(b) {
if(b&1)
res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main() {
cin>>T;
p[0]=1;
for(int i=1; i<N; i++)
p[i]=p[i-1]*i%mod;
p1[N-1]=qpow(p[N-1],mod-2);
for(int i=N-2; i>=0; i--)
p1[i]=p1[i+1]*(i+1)%mod;
while(T--) {
ll a,b,n,m;
cin>>a>>b>>n>>m;
if(n>=1&&m>=1&&m<=n)
cout<<qpow(b,m-1)*qpow(a,n-m)%mod*p[n-1]%mod*p1[m-1]%mod*p1[n-m]%mod<<endl;
else
cout<<0<<endl;
}
return 0;
}