#include #include using namespace std ; using ll = long long ; int n, k, m, mask ; vector 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=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 ; }