Language: C++

#include <bits/stdc++.h>

#define FOR(i, a, b) for(int i = a;i < b;i++)
#define For(i, a) FOR(i, 0, a)
#define REV(i, a, b) for(int i = b-1;i >= a;i--)
#define Rev(i, a) REV(i, 0, a)
#define REP(a) For(i, a)
#define DEBUG_PRINT(...) fprintf(stderr, __VA_ARGS__)

using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef vector<int> vi;
void print_pair(pi a){
  cerr<<"("<<a.first<<", "<<a.second<<") ";
}
template<int T1, int T2>
void print_2d(int a[T1][T2], int x, int y){
  For(i, x){
    For(j, y){
      cerr<<a[i][j]<<" ";
    }
    cerr<<endl;
  }
}

template<typename T>
int sgn(T val){
  return (T(0)<val)-(val<T(0));
}

tuple<long long,long long,long long> egcd(long long a,long long b){
  if(a==0||b==0)return std::make_tuple(0LL,0LL,0LL);
  long long sa=sgn(a),sb=sgn(b);
  a=std::abs(a);b=std::abs(b);
  long long p=1,q=0,r=0,s=1;
  while(b>0){
    long long c=a/b;
    long long d;
    d=a;a=b;b=d%b;
    d=p;p=q;q=d-c*q;
    d=r;r=s;s=d-c*s;
  }
  return std::make_tuple(a,p*sa,r*sb);
}

long long inverse(long long a,long long m){
  auto b=egcd(a,m);
  if(std::get<0>(b)!=1)return 0;
  return (std::get<1>(b)<0)?std::get<1>(b)+m:std::get<1>(b);
}

long long factorial(long long a,long long m){
  long long ret=1;
  for (long long i = 1; i <= a; i++) {
    ret*=(i%m);
    ret%=m;
  }
  return ret;
}
long long partial_factorial(long long a,long long n,long long m){
  long long ret=1;
  for (long long i = 0; i < n; i++) {
    ret*=(a-i)%m;
    ret%=m;
  }
  return ret;
}
long long combination_prime(long long n,long long r,long long m){
  long long ret;
  long long fact_r=factorial(r,m);
  ret=inverse(fact_r,m);
  long long pfact_n=partial_factorial(n,r,m);
  ret*=pfact_n;
  ret%=m;
  return ret;
}
long long cache_cmb[1000000],cache_inv_fact[1000000];
bool cached=false;
long long combination_cached(long long n,long long r,long long m){
  if(cached==false){
    cache_inv_fact[1]=1;
    for (long long i = 2; i <= n; i++) {
      cache_inv_fact[i]=(m-m/i)*cache_inv_fact[i]%m;
    }
    cache_cmb[0]=1;
    for (long long i = 1; i <= n/2; i++) {
      cache_cmb[i]=c[i-1]*(n-i+1)%m*cache_inv_fact[i]%m;
    }
  }
  r=min(r,n-r);
  return cache_cmb[r];
}

ll N,A,B,K;
vector<pair<ll,ll> > pat;
const long long MOD=998244353;

int main(){
  cin>>N>>A>>B>>K;
  ll tmpA=max(A,B),tmpB=min(A,B);
  A=tmpA;B=tmpB;
  cerr<<A<<","<<B<<endl;
  auto eab=egcd(A,B);
  cerr<<get<0>(eab)<<get<1>(eab)<<get<2>(eab)<<endl;
  if(K%get<0>(eab)!=0){cout<<0<<endl;return 0;}
  auto n=K/get<0>(eab);
  auto ab=make_pair(get<1>(eab)*n,get<2>(eab)*n);
  print_pair(ab);
  auto tmp=ab.second/(A/get<0>(eab));
  ab.first+=tmp*(B/get<0>(eab));ab.second-=tmp*(A/get<0>(eab));
  print_pair(ab);
  while(ab.first>=0&&max(ab.first,ab.second)<=N){
    pat.push_back(ab);
    ab.first-=B/get<0>(eab);ab.second+=A/get<0>(eab);
  }
  for(auto tmp:pat){print_pair(tmp);}
  ll ans=0;
  for(auto tmp:pat){
    ans+=combination_cached(N,tmp.first,MOD)*combination_cached(N,tmp.second,MOD)%MOD;
    ans%=MOD;
  }
  cout<<ans<<endl;
  return 0;
}


Compiler output:
a.cc: In function 'long long int combination_cached(long long int, long long int, long long int)':
a.cc:88:20: error: 'c' was not declared in this scope
   88 |       cache_cmb[i]=c[i-1]*(n-i+1)%m*cache_inv_fact[i]%m;
      |                    ^