#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
namespace Xrocks {}
using namespace Xrocks;
namespace Xrocks {
class in {
} user_input;
class out {
} output;
in& operator>>(in& X, int& Y) {
  scanf("%d", &Y);
  return X;
}
in& operator>>(in& X, char* Y) {
  scanf("%s", Y);
  return X;
}
in& operator>>(in& X, float& Y) {
  scanf("%f", &Y);
  return X;
}
in& operator>>(in& X, double& Y) {
  scanf("%lf", &Y);
  return X;
}
in& operator>>(in& X, char& C) {
  scanf("%c", &C);
  return X;
}
in& operator>>(in& X, string& Y) {
  cin >> Y;
  return X;
}
in& operator>>(in& X, long long& Y) {
  scanf("%lld", &Y);
  return X;
}
template <typename T>
in& operator>>(in& X, vector<T>& Y) {
  for (auto& x : Y) user_input >> x;
  return X;
}
template <typename T>
out& operator<<(out& X, const T& Y) {
  cout << Y;
  return X;
}
template <typename T>
out& operator<<(out& X, vector<T>& Y) {
  for (auto& x : Y) output << x << " ";
  return X;
}
out& operator<<(out& X, const int& Y) {
  printf("%d", Y);
  return X;
}
out& operator<<(out& X, const char& C) {
  printf("%c", C);
  return X;
}
out& operator<<(out& X, const string& Y) {
  printf("%s", Y.c_str());
  return X;
}
out& operator<<(out& X, const long long& Y) {
  printf("%lld", Y);
  return X;
}
out& operator<<(out& X, const float& Y) {
  printf("%f", Y);
  return X;
}
out& operator<<(out& X, const double& Y) {
  printf("%lf", Y);
  return X;
}
out& operator<<(out& X, const char Y[]) {
  printf("%s", Y);
  return X;
}
template <typename T>
T max(T A) {
  return A;
}
template <typename T, typename... args>
T max(T A, T B, args... S) {
  return max(A > B ? A : B, S...);
}
template <typename T>
T min(T A) {
  return A;
}
template <typename T, typename... args>
T min(T A, T B, args... S) {
  return min(A < B ? A : B, S...);
}
template <typename T>
void vectorize(int y, vector<T>& A) {
  A.resize(y);
}
template <typename T, typename... args>
void vectorize(int y, vector<T>& A, args&&... S) {
  A.resize(y);
  vectorize(y, S...);
}
long long fast(long long a, long long b, long long pr) {
  if (b == 0) return 1 % pr;
  long long ans = 1 % pr;
  while (b) {
    if (b & 1) ans = (ans * a) % pr;
    b >>= 1;
    a = (a * a) % pr;
  }
  return ans;
}
int readInt() {
  int n = 0;
  int ch = getchar_unlocked();
  int sign = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') sign = -1;
    ch = getchar_unlocked();
  }
  while (ch >= '0' && ch <= '9')
    n = (n << 3) + (n << 1) + ch - '0', ch = getchar_unlocked();
  n = n * sign;
  return n;
}
long long readLong() {
  long long n = 0;
  int ch = getchar_unlocked();
  int sign = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') sign = -1;
    ch = getchar_unlocked();
  }
  while (ch >= '0' && ch <= '9')
    n = (n << 3) + (n << 1) + ch - '0', ch = getchar_unlocked();
  n = n * sign;
  return n;
}
long long readBin() {
  long long n = 0;
  int ch = getchar_unlocked();
  int sign = 1;
  while (ch < '0' || ch > '1') {
    if (ch == '-') sign = -1;
    ch = getchar_unlocked();
  }
  while (ch >= '0' && ch <= '1')
    n = (n << 1) + (ch - '0'), ch = getchar_unlocked();
  return n;
}
long long inv_(long long val,
               long long pr = static_cast<long long>(998244353)) {
  return fast(val, pr - 2, pr);
}
}  // namespace Xrocks
pair<int, int> operator+(const pair<int, int>& a, const pair<int, int>& b) {
  return {(a.first + b.first), (a.second + b.second)};
}
class fact_mod {
  int fact[1000000 + 1], invfact[1000000 + 1], mod_inv[1000000 + 1];

 public:
  fact_mod() {
    fact[0] = 1;
    invfact[0] = 1;
    long long P = 998244353;
    mod_inv[1] = 1;
    mod_inv[0] = 0;
    for (int i = 2; i <= 1000000; i++) {
      mod_inv[i] = (-(P / i) * mod_inv[P % i]) % P + P;
    }
    for (long long int i = 1; i <= 1000000; i++) {
      fact[i] = (fact[i - 1] * i) % P;
      invfact[i] = (invfact[i - 1] * (1LL * mod_inv[i])) % P;
    }
  }
  long long fac(int k) { return fact[k]; }
  long long inv_fac(int k) { return invfact[k]; }
  long long inv(int k) { return mod_inv[k]; }
  long long ncr(int n, int k) {
    if (k > n) return 0;
    long long val = fact[n] *
                    (((invfact[n - k] * 1LL) * invfact[k]) % 998244353) %
                    998244353;
    return val;
  }
} F;
class solve {
 public:
  solve() {
    int p, s, r;
    user_input >> p >> s >> r;
    if (r == 0 && s == 0) {
      output << F.inv(p);
      return;
    }
    if (r == 0) r = 1;
    long long ans = 0;
    for (int i = r; i <= s; i++) {
      for (int k = 1; k <= p && (s - k * i) >= 0; k++) {
        if ((s - k * i) > ((p - k) * (i - 1))) continue;
        if (s == (k * i)) {
          ans =
              (ans + (F.inv(k) * F.ncr(p - 1, k - 1)) % 998244353) % 998244353;
          continue;
        }
        int v = (s - k * i) / i;
        long long val = 0;
        int A = 0;
        for (int j = 0; j <= v && j <= (p - k); j++) {
          if (A) {
            val = val - (F.ncr(p - k, j) * coeff(p - k, s - k * i - j * i)) %
                            998244353;
            if (val < 0) val += 998244353;
          } else {
            val = val + (F.ncr(p - k, j) * coeff(p - k, s - k * i - j * i)) %
                            998244353;
            if (val >= 998244353) val -= 998244353;
          }
          A ^= 1;
        }
        ans = ans + (val * ((F.inv(k) * F.ncr(p - 1, k - 1)) % 998244353)) %
                        998244353;
      }
    }
    ans %= 998244353;
    ans = (ans * inv_(F.ncr(s - r + p - 1, p - 1), 998244353)) % 998244353;
    output << ans;
  }
  int coeff(int p, int t) {
    if (p == 0) return 0;
    long long ans = F.inv_fac(t);
    ans = (ans * F.inv_fac(p - 1)) % 998244353;
    return (ans * F.fac(p + t - 1)) % 998244353;
  }
};
int32_t main() {
  int t = 1, i = 1;
  if (0 || 0) scanf("%d", &t);
  while (t--) {
    if (0) printf("Case #%d: ", i++);
    new solve;
  }
  output << "\n";
  return 0;
}
