#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
const int INF = 1000000007;
const double PI = acos(-1.0);
long long f[MAXN], g[MAXN];
long long extended_euclidean(long long a, long long b, long long &x,
                             long long &y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  long long res = extended_euclidean(b, a % b, y, x);
  y -= a / b * x;
  return res;
}
long long modular(long long x, long long m) {
  if (x < 0) x += abs(x / m) * m + m;
  return x % m;
}
long long modular_inverse(long long a, long long m) {
  long long x, y;
  extended_euclidean(a, m, x, y);
  return modular(x, m);
}
long long qpow(long long a, long long b, long long P) {
  if (b == 0) return 1;
  if (b == 1) return a % P;
  long long ans = qpow(a * a % P, b / 2, P);
  if (b & 1) return ans * a % P;
  return ans;
}
int GG[1000000];
long long finv(long long a, long long P) { return modular_inverse(a, P); }
long long C(int N, int i, int j, long long P, int t, long long F) {
  long long cnt = g[N] - g[N - i] - g[i - j] - g[j];
  long long ans = f[N] * finv(f[N - i], F) % F;
  ans = ans * finv(f[i - j], F) % F;
  ans = ans * finv(f[j], F) % F;
  if (cnt >= t) return 0;
  long long K = 1;
  for (int i = 1; i <= t - cnt; ++i) K *= P;
  return ans % K * (F / K);
}
long long cal(int N, int L, int R, long long P, int t, long long F) {
  f[0] = 1;
  g[0] = 0;
  for (int i = 1; i <= N; ++i) {
    int temp = i;
    g[i] = g[i - 1];
    while (temp % P == 0) {
      temp /= P;
      ++g[i];
    }
    f[i] = f[i - 1] * temp % F;
  }
  long long ans = 0;
  for (int i = L; i <= N; ++i) {
    int a = L, b = min(R, i);
    if ((a + i) % 2 == 1) ++a;
    if ((b + i) % 2 == 1) --b;
    if (a > b) continue;
    long long temp = C(N, i, (i + a) / 2, P, t, F);
    if (b < i) temp = (temp - C(N, i, (i + b + 2) / 2, P, t, F) + F) % F;
    ans = (ans + temp) % F;
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  int N, L, R;
  long long P;
  cin >> N >> P >> L >> R;
  vector<pair<long long, long long> > X;
  for (int i = 2; i * i <= 2000000009; ++i) {
    if (P % i != 0) continue;
    int t = 0;
    long long F = 1;
    while (P % i == 0) {
      ++t;
      P /= i;
      F *= i;
    }
    long long ans = cal(N, L, R, i, t, F);
    X.push_back(make_pair(F, ans));
  }
  if (P != 1) {
    long long ans = cal(N, L, R, P, 1, P);
    X.push_back(make_pair(P, ans));
    P = 1;
  }
  for (int i = 0; i < X.size(); ++i) P = P * X[i].first;
  long long ans = 0;
  for (int i = 0; i < X.size(); ++i) {
    long long Wi = P / X[i].first;
    long long y = finv(Wi, X[i].first);
    ans = (ans + y * Wi % P * X[i].second) % P;
  }
  cout << ans << endl;
  return 0;
}
