主要作为一个模板和总结
#include
#include
#include
#include
#define maxn 524288
#define ll long long
#define mo 998244353
using namespace std;
ll n,m,T,S,a[maxn],b[maxn],c[maxn];
ll w[maxn+5],inv[maxn+5];
int bt[maxn];
ll ksm(ll x,ll y){
ll s=1;
for(;y;y/=2,x=x*x%mo) if (y&1)
s=s*x%mo;
return s;
}
void clear(ll *a,int n){memset(a,0,sizeof(ll)*n);}
void prepare(){
inv[0]=inv[1]=1;
for(int i=2;i<=maxn;i++) inv[i]=(mo-mo/i)*inv[mo%i]%mo;
w[0]=1,w[1]=ksm(3,(mo-1)/maxn);
for(int i=2;i<=maxn;i++)
w[i]=w[i-1]*w[1]%mo;
}
void getbt(int n){for(int i=1;i<n;i++)bt[i]=(bt[i>>1]>>1)|((i&1)?n>>1:0);}
int getlim(int n){int lim=1;while (lim<=n) lim<<=1;return lim;}
void dft(ll *a,int sig,int lim){
for(int i=0;i<lim;i++) if (i<bt[i]) swap(a[i],a[bt[i]]);
for(int mid=1;mid<lim;mid<<=1){
int d=sig*maxn/(mid<<1),s=(sig<0)?maxn:0;
for(int j=0;j<lim;j+=mid<<1){
for(int k=0,p=s;k<mid;k++,p+=d){
ll x=a[j+k],y=a[j+k+mid]*w[p];
a[j+k]=(x+y)%mo,a[j+k+mid]=(x-y)%mo;
}
}
}
}
void getinv(ll *a,ll *b,int lim){
static ll A[maxn],B[maxn],C[maxn];
clear(b,lim);
b[0]=ksm(a[0],mo-2);
for(int len=2;len<=lim;len<<=1){
int L=len<<1;getbt(L);
clear(A,L),clear(B,L);
for(int i=0;i<len;i++) A[i]=a[i];
for(int i=0;i<len;i++) B[i]=b[i];
dft(A,1,L),dft(B,1,L);
for(int i=0;i<L;i++) C[i]=A[i]*B[i]%mo*B[i]%mo;
dft(C,-1,L);for(int i=0;i<L;i++) C[i]=C[i]*inv[L]%mo;
for(int i=0;i<len;i++) b[i]=(b[i]*2-C[i])%mo;
}
}
void multi(ll *a,ll *b,ll *c,int lim){
getbt(lim);
dft(a,1,lim),dft(b,1,lim);
for(int i=0;i<lim;i++) c[i]=a[i]*b[i]%mo;
dft(c,-1,lim);
for(int i=0;i<lim;i++) c[i]=c[i]*inv[lim]%mo;
}
void getln(ll *a,ll *b,int lim){
static ll A[maxn],B[maxn];
clear(A,lim<<1),clear(B,lim<<1);
for(int i=0;i<lim-1;i++) A[i]=a[i+1]*(i+1)%mo;
getinv(a,B,lim);
for(int i=lim;i<lim<<1;i++) A[i]=B[i]=0;
multi(A,B,b,lim<<1);
for(int i=lim-1;i>=0;i--) b[i+1]=b[i]*inv[i+1]%mo;b[0]=0;
for(int i=lim;i<lim<<1;i++) b[i]=0;
}
void getexp(ll *a,ll *b,int lim){
static ll G[maxn],F[maxn],H[maxn];
clear(G,lim<<1),clear(F,lim<<1),clear(H,lim<<1);
G[0]=1;
for(int len=2;len<=lim<<1;len<<=1){
getln(G,F,len);
for(int i=0;i<len;i++) F[i]=((i==0)-F[i]+a[i])%mo;
multi(G,F,H,len<<1);
for(int i=0;i<len;i++) G[i]=H[i];
for(int i=len;i<len<<1;i++) G[i]=0;
}
for(int i=0;i<lim;i++) b[i]=G[i];
}
int main(){
freopen("ceshi.in","r",stdin);
// freopen("sum.in","r",stdin);
// freopen("sum.out","w",stdout);
prepare();
scanf("%lld%lld%lld%lld",&S,&T,&n,&m);
ll C=1;
for(int i=0;i<=min(m-n,S-n*T);i++)
a[i]=C,C=C*inv[i+1]%mo*((S-n*T-i)%mo)%mo;
C=T;
for(int i=0;i<=min(m-n,T);i++)
b[i]=C,C=C*inv[i+2]%mo*((T-i-1)%mo)%mo;
ll k=b[0],invk=ksm(k,mo-2);
for(int i=0;i<=m-n;i++) b[i]=b[i]*invk%mo;
int lim=getlim(m-n);
getln(b,c,lim);
for(int i=0;i<lim;i++) b[i]=c[i]*(n%mo)%mo;
getexp(b,c,lim);
multi(c,a,b,lim<<1);
printf("%lld",(b[m-n]*ksm(k,n)%mo+mo)%mo);
}