문제

링크

풀이

#include <iostream>
#include <vector>
using namespace std;
 
long long power(long long base, long long exp, long long mod) {
  long long ret = 1;
  while (exp) {
    if (exp & 1) ret = ret * base % mod;
    base = base * base % mod;
    exp >>= 1;
  }
  return ret;
}
 
void solve(void) {
  long long l, r, p; cin >> l >> r >> p;
  if (l == r) {
    cout << power(l, p-2, p);
    return;
  }
 
  vector<long long> pre(r-l+1, 0); pre[0] = l % p;
  for (int i=1; i<=r-l; i++) pre[i] = pre[i-1] * (l+i) % p;
  vector<long long> suf(r-l+1, 0); suf[r-l] = r % p;
  for (int i=r-l-1; i>=0; i--) suf[i] = suf[i+1] * (l+i) % p;
 
  long long ans = 0, inv = power(pre[r-l], p-2, p);
  for (int i=0; i<=r-l; i++) {
    if (i == 0) ans = (ans + (suf[1] * inv % p)) % p;
    else if (i == r-l) ans = (ans + (pre[r-l-1] * inv % p)) % p;
    else ans = (ans + ((pre[i-1] * suf[i+1] % p) * inv % p)) % p;
  }
  cout << ans;
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  solve();
  return 0;
}