#include <iostream>
#include <vector>
using namespace std ;
using ll = long long ;
int n, k, m, mask ;
vector<ll> cntb, perm, ni ;
const ll MOD = 998244353 ;
ll expo(ll a, ll n) {
   n %= (MOD-1) ;
   ll r = 1 ;
   while (n) {
      if (n & 1)
         r = (r * a) % MOD ;
      a = (a * a) % MOD ;
      n >>= 1 ;
   }
   return r ;
}
ll inv(ll a) {
   a %= MOD ;
   return expo(a, MOD-2) ;
}
void transform(ll *from, ll *to) 
{ 
    if(to - from == 1) 
        return; 
    ll *mid = from + (to - from) / 2; 
    transform(from, mid); 
    transform(mid, to); 
    for(int i = 0; i < mid - from; i++) 
        *(from + i) = (*(from + i) - *(mid + i)) % MOD ;
}
int main() {
   cin >> n >> k >> m ;
   mask = 1 ;
   while (m > mask)
      mask = 2 * mask + 1 ;
   cntb.resize(mask+1) ;
   for (int i=0; i<=mask; i++) {
      int t = m + 1 ;
      int t2 = 0 ;
      int tb = 0 ;
      for (int j=0; (mask+1)>>j; j++, t >>= 1)
         if (0 == ((i >> j) & 1))
            t2 |= (t & 1)<<(tb++) ;
         else if (0 == ((m >> j) & 1))
            t2 = 0 ;
      cntb[i] = t2 ;
   }
   ni.resize(m+3) ;
   ni[0] = ni[1] = 1 ;
   for (int i=2; i<=m+2; i++)
      ni[i] = inv(i) ;
   perm.resize(m+3) ;
   for (int i=0; i<n; i++)
      perm[0] = 0 ;
   ll f = 1 ;
   for (int i=2; i<=n; i++)
      f = f * i % MOD ;
   perm[n] = f ;
   for (int i=n+1; i<=m+2; i++)
      perm[i] = perm[i-1] * i % MOD * ni[i-n] % MOD ;
   for (int i=mask; i>=0; i--)
      cntb[i] = perm[cntb[i]] ;
   transform(cntb.data(), cntb.data() + mask + 1) ;
   ll s = 0 ;
   for (int i=0; i<=mask; i++)
      if (__builtin_popcount(i) >= k)
         s = (s + cntb[i]) % MOD ;
   s = (s + MOD) % MOD ;
   cout << s << endl ;
}
