提交时间:2023-08-16 20:15:57
运行 ID: 98848
#include <bits/stdc++.h> #define int long long using namespace std; const int N = 2e5 + 5; const int MOD = 1e9 + 7; struct NODE { int n, k, id, ans; } a[N]; int t, in, ik, ans = 1, fac[N], as[N], inv[N], f[N]; int mod(int x) { return (x % MOD + MOD) % MOD; } int ksm(int x,int y){ int res=1; for(;y;y>>=1,x=mod(1ll*x*x)) if(y&1) res=mod(1ll*res*x); return res; } int C(int n, int m) { return mod(mod(fac[n] * inv[m]) * inv[n - m]); } signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> t; fac[0] = 1, inv[0] = 1; int maxn = 0; for (int i = 1; i <= t; ++ i) { cin >> a[i].n >> a[i].k; a[i].id = i; maxn = a[i].n; } int block = sqrt(maxn); fac[0] = inv[0] = 1; for (int i = 1; i <= maxn; ++ i) { f[i] = (i - 1) / block + 1, fac[i] = mod(fac[i - 1] * i); } inv[maxn] = ksm(fac[maxn], MOD - 2); for (int i = maxn - 1; i; -- i) { inv[i] = mod(1ll * inv[i + 1] * (i + 1)); } sort(a + 1, a + t + 1, [](NODE X, NODE Y) { return (f[X.n] ^ f[Y.n]) ? X.n < Y.n : X.k < Y.k; }); for (int i = 1; i <= t; ++ i) { while (ik > a[i].k) { ans = mod(ans - C(in, ik)), --ik; } while (in < a[i].n) { ++in, ans = mod(mod(2l * ans) - C(in - 1, ik)); } while (in > a[i].n) { --in, ans = 1ll * mod(mod(ans + C(in, ik)) * inv[2]); } while (ik < a[i].k) { ans = mod(ans + C(in, ++ik)); } as[a[i].id] = ans; } for (int i = 1; i <= t; ++ i) { cout << as[i] << '\n'; } }