#include <bits/stdc++.h>
using namespace std;
const unsigned MAXN = 1e5 + 5;
unsigned n, p, l, r, phi, t, ans;
unsigned pp[MAXN], fac[MAXN], ifac[MAXN], a[15][MAXN];
inline unsigned read() {
  unsigned x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x;
}
template <typename T1, typename T2>
inline void Add(T1 &x, T2 y) {
  x += y, x >= p && (x -= p);
}
inline unsigned qpow(unsigned x, unsigned y) {
  long long r = 1, k = x;
  while (y) {
    if (y & 1) r *= k, r %= p;
    k *= k, k %= p, y >>= 1;
  }
  return r;
}
inline void init(unsigned x) {
  phi = x;
  for (unsigned i = 2; i * i <= x; i++) {
    if (x % i) continue;
    while (x % i == 0) x /= i;
    phi = phi / i * (i - 1), pp[++t] = i;
  }
  if (x > 1) phi = phi / x * (x - 1), pp[++t] = x;
}
inline void prepare() {
  fac[0] = ifac[0] = 1;
  for (unsigned i = 1; i <= n; i++) {
    unsigned tmp = i;
    for (unsigned j = 1; j <= t; j++) {
      a[j][i] = a[j][i - 1];
      while (tmp % pp[j] == 0) tmp /= pp[j], a[j][i]++;
    }
    fac[i] = 1ll * fac[i - 1] * tmp % p;
    ifac[i] = qpow(fac[i], phi - 1);
  }
}
inline unsigned C(unsigned x, unsigned y) {
  if (x < y) return 0;
  if (y > n) return 0;
  long long t = 1ll * fac[x] * ifac[y] % p * ifac[x - y] % p;
  for (unsigned i = 1; i <= ::t; i++)
    if (pp[i] <= x) t = t * qpow(pp[i], a[i][x] - a[i][y] - a[i][x - y]) % p;
  return t;
}
signed main() {
  n = read(), p = read();
  l = read(), r = read();
  init(p), prepare();
  for (unsigned i = 0; i <= n - l; i++)
    Add(ans,
        1ll * C(n, i) *
            (C(n - i, (n - i - l) >> 1) + p - C(n - i, (n - i - r - 1) >> 1)) %
            p);
  return printf("%u\n", ans), 0;
}
