#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 50; typedef long long ll; const ll mod = 1e9 + 7; ll fac[maxn], sing[maxn], inv[maxn]; void init(int n) { fac[0] = sing[0] = inv[0] = fac[1] = sing[1] = inv[1] = 1; for(int i = 2; i <= n; i++) { fac[i] = fac[i - 1] * i % mod; sing[i] = (mod - mod / i) * sing[mod % i] % mod; inv[i] = inv[i - 1] * sing[i] % mod; } } ll C(int n, int m) { ll res = fac[n]* inv[m] % mod * inv[n - m] % mod; // printf("%d %d %lld\n",n, m, res); return res; } struct Seg { int l, r, belong, id; }seg[maxn]; ll ans[maxn]; bool cmp(Seg A, Seg B) { if(A.belong == B.belong) return A.r < B.r; return A.l < B.l; } int main() { init(1e5 + 5); int block = sqrt(1e5); int T; scanf("%d", &T); for(int p = 1; p <= T; p++) { scanf("%d %d", &seg[p].l, &seg[p].r); seg[p].belong = seg[p].l / block; seg[p].id = p; } sort(seg + 1, seg + T + 1, cmp); int l = 0, r = 0; ll res = 1; for(int i = 1; i <= T; i++) { while(l < seg[i].l) { res = (res * 2LL % mod + mod - C(l, r)) % mod; l++; } while(l > seg[i].l) { l--; res = (res + C(l, r)) * sing[2] % mod; } while(r < seg[i].r) { r++; res = (res + C(l, r)) % mod; } while(r > seg[i].r) { res = (res + mod - C(l, r)) % mod; r--; } ans[seg[i].id] = res; // printf("%lld\n", ans[seg[i].id]); } for(int i = 1; i <= T; i++) { printf("%lld\n", ans[i]); } return 0; }
相关文章: