Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98704 | _ | ssh | C++ | 通过 | 100 | 122 MS | 4160 KB | 1896 | 2023-08-16 12:50:41 |
#include <bits/stdc++.h> using namespace std; typedef long long ull; const ull DVS = 1e9 + 7; const ull BW = 320; const ull MXN = 1e5 + 5; ull iv[MXN], faciv[MXN], fac[MXN]; int ans[MXN]; int read() { int x(0); char c(getchar()); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar(); return x; } inline ull C(ull N, ull M) { return M > N ? 0 : fac[N] * faciv[M] % DVS * faciv[N - M] % DVS; } ull pow(ull b, ull p) { ull res(1); while (p) { if (p & 1) res = res * b % DVS; b = b * b % DVS; p >>= 1; } return res; } struct Question { int N, M, id; Question(int n = 0,int m = 0, int i = 0): N(n), M(m), id(i) {} } qs[MXN]; bool operator<(Question lhs, Question rhs) { return lhs.N / BW == rhs.N / BW ? ((lhs.N / BW) & 1 ? lhs.M > rhs.M : lhs.M < rhs.M) : lhs.N < rhs.N; } int main() { const int Q(read()); for (int i(0); i != Q; ++i) qs[i].N = read(), qs[i].M = read(), qs[i].id = i; iv[1] = fac[0] = faciv[0] = fac[1] = faciv[1] = 1; for (int i(2); i != MXN; ++i) iv[i] = (DVS - DVS / i) * iv[DVS % i] % DVS, fac[i] = fac[i - 1] * i % DVS, faciv[i] = faciv[i - 1] * iv[i] % DVS; sort(qs, qs + Q); for (int i(0), n(1), m(0), s(1); i != Q; ++i) { // if (qs[i].N <= qs[i].M) { // ans[qs[i].id] = pow(2, qs[i].N); // continue; // } while (n < qs[i].N) s = ((s << 1) + DVS- C(n++, m)) % DVS; while (n > qs[i].N) s = (s + C(--n, m)) % DVS * iv[2] % DVS; while (m < qs[i].M) s = (s + C(n, ++m)) % DVS; while (m > qs[i].M) s = (s + DVS - C(n, m--)) % DVS; ans[qs[i].id] = s; } for (int i(0); i != Q; ++i) printf("%d\n",ans[i]); return 0; }