提交时间:2023-08-16 13:03:47
运行 ID: 98720
#include <bits/stdc++.h> #pragma GCC target("avx,sse2,sse3,sse4,mmx") #pragma GCC optimize("Ofast") using i64 = int64_t; 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]; if (pos[l] & 1) return r < a.r; else return r > a.r; } } q[N]; int f_pow(int a, int 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; } int binom(int n, int m) { if (n < m) return 0; return (fac[n] * inv[m] % mod) * inv[n - m] % mod; } inline int Plus(const int &a, const int &b) { int t = a + b; return t >= mod ? t - mod : t; } inline int Minu(const int &a, const int &b) { int t = a - b; return t < 0 ? t + mod : t; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int t, maxn = 0; std::cin >> t; for (int i = 1; i <= t; i++) { std::cin >> q[i].r >> q[i].l; 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 = Minu(Plus(now, now), binom(r++, l)); while (l > q[i].l) now = Minu(now, binom(r, l--)); while (r > q[i].r) now = (i64)Plus(now, binom(--r, l)) * inv[2] % mod; while (l < q[i].l) now = Plus(now, binom(r, ++l)); ans[q[i].id] = now; } for (int i = 1; i <= t; i++) std::cout << ans[i] << "\n"; return 0; }