Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98818 | CSYZLinZR | ssh | C++ | 通过 | 100 | 189 MS | 5716 KB | 1718 | 2023-08-16 15:34:42 |
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> using namespace std; typedef long long i64; const i64 SIZE = 1e5+5; const i64 MOD = 1e9+7; i64 idx[SIZE], t, n, k; i64 bl; i64 fac[SIZE], inv[SIZE]; i64 qpow(i64 a, i64 b) { i64 res = 1; while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; } struct ask { i64 l, r, id; bool operator<(const ask &rhs) const { if (idx[l] != idx[rhs.l]) return idx[l] < idx[rhs.l]; return r < rhs.r; } } q[SIZE]; i64 ans[SIZE]; i64 C(i64 a, i64 b) { if (a == b || b == 0) return 1; return fac[a] * inv[b] % MOD * inv[a - b] % MOD; } int main() { #ifdef fio freopen("input.in","r",stdin); #endif cin >> t; bl = SIZE / sqrt(t); fac[0] = 1; for (i64 i = 1; i < SIZE; ++i) { idx[i] = (i + bl - 1) / bl; fac[i] = fac[i - 1] * i % MOD; } inv[SIZE - 1] = qpow(fac[SIZE - 1], MOD - 2); for (i64 i = SIZE - 2; i >= 0; --i) { inv[i] = inv[i + 1] * (i + 1) % MOD; } for (i64 i = 1; i <= t; ++i) { scanf("%lld%lld",&q[i].l,&q[i].r); q[i].id = i; } sort(q + 1, q + 1 + t); i64 l = 0, r = 0, now = 1, inv2 = qpow(2, MOD - 2); for (i64 o = 1; o <= t; ++o) { while (l < q[o].l) { now = ((now * 2 % MOD - C(l, r)) % MOD + MOD) % MOD; ++l; } while (l > q[o].l) { now = (now + C(l - 1, r)) % MOD * inv2 % MOD; --l; } while (r < q[o].r) { now = (now + C(l, r + 1)) % MOD; ++r; } while (r > q[o].r) { now = ((now - C(l, r)) % MOD + MOD) % MOD; --r; } ans[q[o].id] = now; // printf("%lld\n",now); } for (i64 o = 1; o <= t; ++o) { printf("%lld\n",ans[o]); } return 0; }