#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool upmin(T &x, T y) {
  return y < x ? x = y, 1 : 0;
}
template <typename T>
inline bool upmax(T &x, T y) {
  return x < y ? x = y, 1 : 0;
}
const long double eps = 1e-11;
const long double pi = acos(-1);
const long long oo = 1 << 30;
const long long loo = 1ll << 62;
const long long MAXN = 200005;
const long long INF = 0x3f3f3f3f;
inline long long read() {
  long long f = 1, x = 0;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + (c ^ 48);
    c = getchar();
  }
  return x * f;
}
long long p[11], mods, num = 0, phi;
long long upd(long long x, long long y) {
  return x + y >= mods ? x + y - mods : x + y;
}
long long quick_pow(long long x, long long y) {
  long long ret = 1;
  for (; y; y >>= 1) {
    if (y & 1) ret = 1ll * ret * x % mods;
    x = 1ll * x * x % mods;
  }
  return ret;
}
struct Number {
  long long q[11], rm;
  void Init() {
    rm = 1;
    memset(q, 0, sizeof q);
  }
  Number operator*(long long b) {
    Number c;
    c.Init();
    for (long long i = 0; i < num; i++) {
      c.q[i] = q[i];
      while (b % p[i] == 0) b /= p[i], c.q[i]++;
    }
    c.rm = 1ll * rm * b % mods;
    return c;
  }
  Number operator*(Number b) {
    Number c;
    c.Init();
    for (long long i = 0; i < num; i++) c.q[i] = q[i] + b.q[i];
    c.rm = 1ll * rm * b.rm % mods;
    return c;
  }
  Number operator/(Number b) {
    Number c;
    c.Init();
    for (long long i = 0; i < num; i++) c.q[i] = q[i] - b.q[i];
    c.rm = 1ll * rm * quick_pow(b.rm, phi - 1) % mods;
    return c;
  }
  long long get() {
    long long t = rm;
    for (long long i = 0; i < num; i++)
      t = 1ll * quick_pow(p[i], q[i]) * t % mods;
    return t;
  }
  void print() {
    for (long long i = 0; i < num - 1; i++)
      cout << p[i] << "^" << q[i] << " * ";
    cout << p[num - 1] << "^" << q[num - 1] << " * " << rm << endl;
  }
} A, B, fac[MAXN], inv[MAXN];
void Init(long long n) {
  long long P = mods;
  phi = mods;
  for (long long i = 2; i * i <= P; i++)
    if (P % i == 0) {
      p[num++] = i, phi = phi / i * (i - 1);
      while (P % i == 0) P /= i;
    }
  if (P > 1) p[num++] = P, phi = phi / P * (P - 1);
  fac[0].Init();
  for (long long i = 1; i <= n; i++) fac[i].Init(), fac[i] = fac[i - 1] * i;
}
long long C(long long x, long long y) {
  if (y < 0 || x < y) return 0;
  return (fac[x] / fac[y] / fac[x - y]).get();
}
long long solve(long long n, long long t) {
  long long ans = 0;
  for (long long s = 0; s <= n; s++)
    ans = (1ll * C(n, s) * (C(s, s / 2) - C(s, (s - t + 1) / 2 - 1)) + ans) %
          mods;
  return (ans + mods) % mods;
}
signed main() {
  long long n = read();
  mods = read();
  long long l = read(), r = read();
  Init(n);
  printf("%lld\n", (solve(n, r) - solve(n, l - 1) + mods) % mods);
  return 0;
}
