func_code_string: #include <bits/stdc++.h>   using namespace std;   const int P = 10, N = 1e5 + 10;   int inverse(int a, int m) {     int m0 = m, t, q;     int x0 = 0, x1 = 1;     if (m == 1) return 0;     while (a > 1) {       q = a / m;       t = m;       m = a % m, a = t;       t = x0;       x0 = x1 - q * x0;       x1 = t;     }     if (x1 < 0) x1 += m0;     return x1;   }   int fact[N], ifact[N], pot[N][P];   vector<int> primes(int n) {     vector<int> ans;     for (int d = 2; d * d <= n; d++)       if (n % d == 0) {         ans.push_back(d);         while (n % d == 0) {           n /= d;         }       }     if (n > 1) ans.push_back(n);     return ans;   }   int mod;   vector<int> p;   int expomod(long long int a, long long int e) {     int ans = 1;     while (e) {       if (e & 1) ans = ans * a % mod;       e /= 2;       a = a * a % mod;     }     return ans;   }   int comb(int m, int n) {     int ans = (long long int)fact[m] * ifact[n] % mod * ifact[m - n] % mod;     for (int i = 0; i < (int)(((int)(p).size())); i++) {       int pp = pot[m][i] - pot[n][i] - pot[m - n][i];       if (pp) ans = (long long int)ans * expomod(p[i], pp) % mod;     }     return ans;   }   int go(int n, int bal) {     long long int ans = 0;     for (int x = 0, y = bal; x + y <= n; x++, y++) {       ans += (long long int)comb(n, x) * comb(n - x, y) % mod;       if (ans >= mod) ans -= mod;     }     return ans;   }   int main() {     int n, l, r;     cin >> n >> mod >> l >> r;     p = primes(mod);     fact[0] = ifact[0] = 1;     for (int i = 1; i <= n; i++) {       int d = -1;       for (int j = 0; j < (int)(((int)(p).size())); j++)         if (i % p[j] == 0) {           d = j;           break;         }       if (d == -1)         fact[i] = i;       else {         fact[i] = fact[i / p[d]];         for (int j = 0; j < (int)(((int)(p).size())); j++)           pot[i][j] = pot[i / p[d]][j] + (j == d);       }       ifact[i] = inverse(fact[i], mod);     }     for (int i = 0; i < (int)(n); i++) {       fact[i + 1] = (long long int)fact[i] * fact[i + 1] % mod;       ifact[i + 1] = (long long int)ifact[i] * ifact[i + 1] % mod;       for (int j = 0; j < (int)(((int)(p).size())); j++)         pot[i + 1][j] += pot[i][j];     }     long long int ans = 0;     for (int i = 0; i < (int)(2); i++) {       ans += go(n, l + i);       ans -= go(n, r + 1 + i);     }     ans %= mod;     if (ans < 0) ans += mod;     cout << ans << endl;     return 0;   }   