#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int w = 0, x = 0;
  char c = getchar();
  while (!isdigit(c)) w |= c == '-', c = getchar();
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  return w ? -x : x;
}
namespace star {
const int maxn = 1e5 + 10;
int p, n, l, r, tot;
int pn[40], inv[maxn], c[maxn][40], mul[maxn], phi;
inline int fpow(int a, int b) {
  int ans = 1;
  for (; b; b >>= 1, a = 1ll * a * a % p)
    if (b & 1) ans = 1ll * ans * a % p;
  return ans;
}
inline int C(int n, int m) {
  if (m < 0 or n < m or n < 0) return 0;
  if (m == 0) return 1;
  int ans = 1ll * mul[n] * inv[m] % p * inv[n - m] % p;
  for (int i = 1; i <= tot; i++)
    ans = 1ll * ans * fpow(pn[i], c[n][i] - c[m][i] - c[n - m][i]) % p;
  return ans;
}
inline void work() {
  n = read(), p = read(), l = read(), r = min(n, read());
  int x = phi = p;
  for (int i = 2; i * i <= x; i++)
    if (!(x % i)) {
      phi = phi / i * (i - 1);
      pn[++tot] = i;
      while (!(x % i)) x /= i;
    }
  if (x > 1) phi = phi / x * (x - 1), pn[++tot] = x;
  mul[0] = inv[0] = mul[1] = inv[1] = 1;
  for (int i = 2; i <= n; i++) {
    x = i;
    for (int j = 1; j <= tot; j++) {
      c[i][j] += c[i - 1][j];
      while (!(x % pn[j])) x /= pn[j], c[i][j]++;
    }
    mul[i] = 1ll * mul[i - 1] * x % p;
    inv[i] = fpow(mul[i], phi - 1);
  }
  int ans = 0;
  for (int i = 0; i <= n - l; i++)
    ans = (ans + 1ll * C(n, i) *
                     ((1ll * C(n - i, (n - i - l) >> 1) -
                       C(n - i, (n - i - r - 1) >> 1) + p) %
                      p)) %
          p;
  printf("%d\n", ans);
}
}  // namespace star
signed main() {
  star::work();
  return 0;
}
