提交时间:2023-08-16 13:23:04
运行 ID: 98751
#include <bits/stdc++.h> using i64 = long long; //{{{Input typedef long long ll; char buf[1 << 20], *P1 = buf, *P2 = buf; inline char gc() { if (P1 == P2) P2 = (P1 = buf) + fread(buf, 1, 1 << 20, stdin); return P1 == P2 ? EOF : *P1++; } inline ll read() { ll s = 0, w = 1; char c = gc(); while (!isdigit(c)) { if (c == '-') w = -1; c = gc(); } while (isdigit(c)) s = (s << 3) + (s << 1) + (c ^ 48), c = gc(); return s * w; } //}}} const int N = 1e5 + 50; int block; const i64 mod = 1e9 + 7; int pos[N]; i64 inv[N], fac[N], ans[N]; struct node { int l, r, id; inline bool operator < (const node& a) { if (pos[l] != pos[a.l]) return pos[l] < pos[a.l]; return r < a.r; } } q[N]; i64 f_pow(i64 a, i64 k) { i64 ans = 1; for (; k; k >>= 1, a = (i64)a * a % mod) if (k & 1) ans = (i64)ans * a % mod; return ans; } void init() { fac[0] = 1; for (int i = 1; i < N; i++) fac[i] = fac[i - 1] * i % mod; inv[N - 1] = f_pow(fac[N - 1], mod - 2); for (int i = N - 2; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod; for (int i = 0; i < N; i++) pos[i] = (i - 1) / block + 1; } i64 binom(int n, int m) { if (m == 0 || n == m) return 1; if (n < m) return 0; return (fac[n] * inv[m] % mod) * inv[n - m] % mod; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t, maxn = 0; t = read(); for (int i = 1; i <= t; i++) { q[i].r = read(), q[i].l = read(); q[i].id = i; maxn = std::max(maxn, q[i].r); } block = sqrt(maxn); std::sort(q + 1, q + 1 + t); init(); i64 now = 1; int l = 0, r = 0; for (int i = 1; i <= t; i++) { while (r < q[i].r) now = (2 * now % mod - binom(r++, l) + mod) % mod; while (l > q[i].l) now = (now - binom(r, l--) + mod) % mod; while (r > q[i].r) now = (now + binom(--r, l)) % mod * inv[2] % mod; while (l < q[i].l) now = (now + binom(r, ++l)) % mod; ans[q[i].id] = now; } for (int i = 1; i <= t; i++) std::cout << ans[i] << "\n"; return 0; }