#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const long long maxn = 1e5 + 5;
long long add(long long x, long long y, long long m) {
  x += y;
  if (x >= m) x -= m;
  return x;
}
long long mul(long long x, long long y, long long m) {
  long long z = 1LL * x * y;
  return z - z / m * m;
}
long long powt(long long a, long long b, long long m) {
  long long r = 1;
  while (b) {
    if (b & 1) r = mul(r, a, m);
    a = mul(a, a, m);
    b >>= 1;
  }
  return r;
}
void extend_Euclid(long long a, long long b, long long &x, long long &y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return;
  }
  extend_Euclid(b, a % b, x, y);
  long long tmp = x;
  x = y;
  y = tmp - (a / b) * y;
}
long long Inv(long long a, long long b) {
  long long x, y;
  extend_Euclid(a, b, x, y);
  return (x % b + b) % b;
}
long long CRT(vector<long long> &a, vector<long long> &m, long long M) {
  long long ans = 0, n = a.size();
  for (long long i = 0; i < n; i++) {
    long long x, y;
    long long Mi = M / m[i];
    extend_Euclid(Mi, m[i], x, y);
    x = (x % M + M) % M;
    ans = add(ans, mul(mul(Mi, x, M), a[i], M), M);
  }
  return ans;
}
map<long long, long long> fac;
vector<long long> fa, fm;
struct node {
  long long u, t, p;
  long long f[maxn], g[maxn];
  void init(long long a, long long b) {
    long long i, x;
    u = a;
    t = b;
    p = powt(a, b, mod * 2);
    for (i = f[0] = 1; i <= 100000; i++) {
      for (x = i; x % u == 0; x /= u)
        ;
      f[i] = mul(f[i - 1], x, p);
    }
    memset(g, 0, sizeof(g));
    for (i = 1; i * u <= 100000; i++) g[i * u] = g[i] + 1;
    for (i = 1; i <= 100000; i++) g[i] += g[i - 1];
  }
  long long get_mul(long long n, long long m) {
    if (m < 0 || n < m) return 0;
    long long tc = g[n] - g[m] - g[n - m];
    if (tc >= t) return 0;
    return mul(powt(u, tc, mod * 2),
               mul(f[n], Inv(mul(f[m], f[n - m], p), p), p), p);
  }
} fs[20];
long long tot = 0;
void init(long long n) {
  for (long long i = 2; i * i <= n; i++) {
    while (n % i == 0) {
      fac[i]++;
      n /= i;
    }
  }
  if (n > 1) fac[n]++;
  for (auto e : fac) {
    fs[tot].init(e.first, e.second);
    fm.push_back(fs[tot++].p);
  }
}
long long cal(long long n, long long m, long long p) {
  fa.clear();
  for (long long i = 0; i < tot; i++) fa.push_back(fs[i].get_mul(n, m));
  return CRT(fa, fm, p);
}
long long solve(long long n, long long k, long long l, long long r,
                long long p) {
  if (k + l > n) return 0;
  long long ans = cal(n, k, p);
  n -= k;
  r = min(r, n);
  if ((n - r) & 1) r--;
  if ((n - l) & 1) l++;
  r += 2;
  long long d = cal(n, (n - l) >> 1, p);
  if (r <= n) d = add(d, p - cal(n, (n - r) >> 1, p), p);
  return mul(ans, d, p);
}
int main() {
  int n, p, l, r, ans = 0;
  scanf("%d%d%d%d", &n, &p, &l, &r);
  init(p);
  for (long long i = 0; i <= n; i++) ans = add(ans, solve(n, i, l, r, p), p);
  printf("%d\n", ans);
  return 0;
}
