fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5.  
  6. const int N = 1111;
  7. const ll M = 1e9 + 9999;
  8.  
  9. int n;
  10. ll L[N+5], R[N+5], fact[N+5], ifact[N+5];
  11.  
  12. inline ll add(ll a, ll b) { a += b; return (a >= M) ? a - M : a; }
  13. inline ll sub(ll a, ll b) { a -= b; return (a < 0) ? a + M : a; }
  14. inline ll mul(ll a, ll b) { return (__int128)a * b % M; }
  15.  
  16. ll pw(ll x, ll n) {
  17. ll a = 1;
  18. x %= M;
  19. for (; n; n >>= 1, x = mul(x, x))
  20. if (n & 1) a = mul(a, x);
  21. return a;
  22. }
  23.  
  24. ll inv(ll x) { return pw(x, M - 2); }
  25.  
  26. void precompute(int n) {
  27. fact[0] = 1;
  28. for (int i = 1; i <= n; i++)
  29. fact[i] = mul(fact[i - 1], i);
  30. ifact[n] = inv(fact[n]);
  31. for (int i = n; i > 0; i--)
  32. ifact[i - 1] = mul(ifact[i], i);
  33. }
  34.  
  35. ll lagrange(const vector<ll>& y, ll n) {
  36. int k = (int)y.size() - 1;
  37. if (n <= k) return y[n];
  38.  
  39. static ll p[N+5], s[N+5];
  40. p[0] = 1;
  41. for (int i = 0; i <= k; i++)
  42. p[i + 1] = mul(p[i], sub(n, i));
  43. s[k + 1] = 1;
  44. for (int i = k; i >= 0; i--)
  45. s[i] = mul(s[i + 1], sub(n, i));
  46.  
  47. ll ans = 0;
  48. for (int i = 0; i <= k; i++) {
  49. ll num = mul(p[i], s[i + 1]), den = mul(ifact[i], ifact[k - i]);
  50. ll term = mul(y[i], mul(num, den));
  51. if ((k - i) & 1) ans = sub(ans, term);
  52. else ans = add(ans, term);
  53. }
  54. return ans;
  55. }
  56.  
  57. int main(){
  58. ios_base::sync_with_stdio(0); cin.tie(0);
  59.  
  60. cin >> n;
  61. precompute(n + 1);
  62. for (int i = 0; i < n; i++)
  63. cin >> L[i] >> R[i];
  64.  
  65. vector<ll> pts;
  66. for (int i = 0; i < n; i++) {
  67. pts.push_back(L[i]);
  68. pts.push_back(R[i] + 1);
  69. }
  70. sort(pts.begin(), pts.end());
  71. pts.erase(unique(pts.begin(), pts.end()), pts.end());
  72.  
  73. ll ans = 0;
  74. for (int id = 0; id < (int)pts.size() - 1; id++) {
  75. ll l = pts[id], r = pts[id + 1] - 1;
  76. if (l > r) continue;
  77.  
  78. vector<int> active;
  79. ll base = 1;
  80. bool skip = false;
  81.  
  82. for (int i = 0; i < n; i++)
  83. if (R[i] < l) base = mul(base, R[i] - L[i] + 1);
  84. else if (L[i] > r) {
  85. skip = true;
  86. break;
  87. } else active.push_back(i);
  88.  
  89. if (skip) continue;
  90.  
  91. int deg = active.size();
  92. int K = deg + 1;
  93. vector<ll> T(K + 1), A(K + 1);
  94. for (int x = 0; x <= K; x++) {
  95. ll val = base;
  96. for (int idx : active)
  97. val = mul(val, x + l - L[idx]);
  98. A[x] = val;
  99. }
  100.  
  101. T[0] = 0;
  102. for (int x = 1; x <= K; x++) {
  103. ll w = mul(x + l - 1, sub(A[x], A[x - 1]));
  104. T[x] = add(T[x - 1], w);
  105. }
  106.  
  107. ans = add(ans, lagrange(T, r - l + 1));
  108. }
  109.  
  110. cout << ans << "\n";
  111.  
  112. cerr << "TIME: " << 1.0 * clock() / CLOCKS_PER_SEC << " s\n";
  113. return 0;
  114. }
  115.  
Success #stdin #stdout #stderr 0.01s 5316KB
stdin
2
1 2
2 3
stdout
10
stderr
TIME: 0.005904 s