件名: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≤if(i、j)= a * f(i-1、j)+ b * f(i-1、j-1)\ quad i \ ge 2,1 \ le j \ le if (i 、j )=A∗f (i−1 、j )+b∗f (i−1 、j−1 )私≥2 、1≤j≤iその他の場合f(i、j)= 0 f(i、j)= 0f (i 、j )=0
はTTを持っていますグループTは、a、b、n、ma、b、n、mが与えられるたびに尋ねますA 、b 、n 、m、求f(n、m)mod(998244353)f(n、m)mod(998244353)f (n 、m )m o d (9 9 8 2 4 4 3 5 3 )
アイデア:問題F:恐ろしい式
と同様ですが、右に下がる方向に下がる点が異なりますが、初期位置は(1、1)(1,1)です。(1 、1 )の場合、オプションの数は(n − 1 m − 1){n-1 \ choicem-1}です。((m − 1N - 1)。したがって、f(1、1)f(1,1)f (1 、1 )の寄与はbm − 1 a − m(n − 1 m − 1)b ^(m-1)a ^(nm)(n-1 \ choice m-1)bm − 1 an − 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;
}