void main(){
  import std.stdio, std.conv, std.string, std.algorithm;

  long n, a, b, k; rd(n, a, b, k);

  const long mod=998244353;
  const int M=1_000_00*4;
  auto fact=new long[](M);
  fact[0]=fact[1]=1;
  foreach(i; 2..M) fact[i]=i*fact[i-1]%mod;
  auto inv_fact=new long[](M);
  long powmod(long a, long x){
    if(x==0) return 1;
    else if(x==1) return a;
    else if(x&1) return a*powmod(a, x-1)%mod;
    else return powmod(a*a%mod, x/2);
  }
  foreach(i; 0..M) inv_fact[i]=powmod(fact[i], mod-2);
  long comb(long nn, long rr){
    long ret=fact[nn]%mod;
    (ret*=inv_fact[rr])%=mod;
    (ret*=inv_fact[nn-rr])%=mod;
    return ret;
  }

  long tot=0;
  for(long x=0; x<=n; x++)if(k-a*x>=0){
    if((k-a*x)%b==0){
      long y=(k-a*x)/b;
      if(y>n) continue;
      (tot+=comb(n, x)*comb(n, y)%mod)%=mod;
    }
  }
  writeln(tot);
}

/*
  xマス赤で塗るとする (0<=x<=N)
  塗り方：comb(N, x)通り
  残りK-A*x点
  Bがこれを割るなら
    y=(K-A*x)/B マス青で上書きする
    y<=Nなら
      comb(N, x)*comb(N, y)

*/

/*
  (4C2)*2+(4C3)*3+(4C3)*3+(4C4)*4 = 40

  x=0 ... 残り5点 -> 無理
  x=1 ... 残り4点 -> y=2 -> (4C1)*(4C2)=24
  x=2 ... 残り3点 -> 無理
  x=3 ... 残り2点 -> y=1 -> (4C3)*(4C1)=16
*/

void rd(T...)(ref T x){
  import std.stdio, std.string, std.conv;
  auto l=readln.split;
  assert(l.length==x.length);
  foreach(i, ref e; x) e=l[i].to!(typeof(e));
}