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