#include <bits/stdc++.h>
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + (c ^ 48), c = getchar();
  if (flag) x = -x;
}
using namespace std;
int n, mod, l, r;
int nl[101000], nr[101000];
void exgcd(long long a, long long b, long long &x, long long &y) {
  if (!b) return x = 1, y = 0, void();
  exgcd(b, a % b, x, y);
  long long tmp = x;
  x = y;
  y = tmp - a / b * y;
}
inline long long get_inv(long long a, long long b, long long c) {
  long long x, y;
  exgcd(a, b, x, y);
  return (x % b + b) % b;
}
namespace jiazp {
int p, k, P;
int h[101000];
long long invpart;
int pcnt;
long long mi[33];
inline void Cheng(int x) {
  int ct = 0;
  while (x % p == 0) x /= p, ++ct;
  pcnt += ct;
  invpart = invpart * x % P;
}
inline void Chu(int x) {
  int ct = 0;
  while (x % p == 0) x /= p, ++ct;
  pcnt -= ct;
  invpart = invpart * get_inv(x, P, 1) % P;
}
long long bkupinv[101000], bkuppcnt[101000];
inline long long work() {
  memset(mi, 0, sizeof(mi));
  mi[0] = 1;
  for (int i = 1; i <= k; ++i) mi[i] = mi[i - 1] * p % P;
  long long res = 0;
  invpart = pcnt = 0;
  for (int i = 0; i <= n; ++i) {
    if (h[i] < 0) continue;
    if (h[i] == 0) {
      invpart = 1;
      pcnt = 0;
      res += bkupinv[i] * mi[bkuppcnt[i]] % P;
    } else {
      if (h[i] == h[i - 1] + 1) {
        Cheng(i);
        Chu(h[i]);
      } else {
        Cheng(i);
        Chu(i - h[i]);
      }
      res += invpart * mi[pcnt] % P * bkupinv[i] % P * mi[bkuppcnt[i]] % P;
    }
  }
  return res % P;
}
inline long long sol() {
  invpart = 1;
  pcnt = 0;
  bkupinv[0] = 1;
  bkuppcnt[0] = 0;
  for (int i = 1; i <= n; ++i) {
    Cheng(n - i + 1);
    Chu(i);
    bkupinv[i] = invpart;
    bkuppcnt[i] = pcnt;
  }
  for (int i = 0; i <= n; ++i) h[i] = nr[i];
  long long ans = work();
  for (int i = 0; i <= n; ++i) h[i] = nl[i];
  ans = (ans - work() + P) % P;
  return ans;
}
}  // namespace jiazp
int a[44], p[44], k[44], ptot, pp[44];
inline void Divi_P() {
  int x = mod;
  for (int i = 2; i * i <= x; ++i)
    if (x % i == 0) {
      p[++ptot] = i;
      int bkup = x;
      while (x % i == 0) ++k[ptot], x /= i;
      jiazp::p = i;
      jiazp::k = k[ptot];
      pp[ptot] = jiazp::P = bkup / x;
      a[ptot] = jiazp::sol();
    }
  if (x > 1) {
    p[++ptot] = x, k[ptot] = 1;
    jiazp::p = x;
    jiazp::k = 1;
    pp[ptot] = jiazp::P = x;
    a[ptot] = jiazp::sol();
  }
  long long ans = 0;
  for (int i = 1; i <= ptot; ++i) {
    ans = (ans + 1ll * a[i] * (mod / pp[i]) % mod *
                     get_inv(mod / pp[i], pp[i], 1) % mod) %
          mod;
  }
  printf("%lld\n", (ans % mod + mod) % mod);
}
int main() {
  read(n), read(mod), read(l), read(r);
  if (mod == 1) return puts("0"), 0;
  for (int d = 0; d <= n; ++d) {
    nr[d] = (d - l) >> 1;
    nl[d] = ((d - r + 1) >> 1) - 1;
  }
  Divi_P();
  return 0;
}
