Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98595 | CSYZYeShuChen | ssh | C++ | 通过 | 100 | 215 MS | 4960 KB | 1504 | 2023-08-16 12:05:09 |
#include<bits/stdc++.h> #define int long long using namespace std; const int mx = 2e5 + 5, mod = 1e9 + 7; int N, sz; int fac[mx], inv[mx], ans[mx]; struct node { int n, k, id; } a[mx]; inline int qpow(int x, int y) { int base = 1; while(y) { if(y & 1) base = base * x % mod; x = x * x % mod; y >>= 1; } return base; } inline bool cmp(node x, node y) {return x.n / sz == y.n / sz ? x.k < y.k : x.n < y.n;} inline int C(int n, int m) { if(n < m) return 0; return fac[n] * inv[m] % mod * inv[n - m] % mod; } signed main() { cin >> N; sz = sqrt(100000); fac[0] = inv[0] = 1; for(int i = 1; i <= 100000; i++) fac[i] = fac[i - 1] * i % mod, inv[i] = qpow(fac[i], mod - 2); for(int i = 1; i <= N; i++) cin >> a[i].n >> a[i].k, a[i].id = i; sort(a + 1, a + N + 1, cmp); a[0].n = 1e9; int res = 0, p1, p2; for(int i = 1; i <= N; i++) { if(a[i].n / sz != a[i - 1].n / sz) { res = 0; p1 = a[i].n; p2 = a[i].k; for(int j = 0; j <= a[i].k; j++) res = res + C(a[i].n, j), res = res % mod; } while(p1 < a[i].n) { res = (res * 2 - C(p1, p2)) % mod; p1++; res = (res % mod + mod) % mod; } while(p1 > a[i].n) { res = (res + C(p1, p2 + 1) - C(p1 - 1, p2 + 1)) * inv[2] % mod; p1--; res = (res % mod + mod) % mod; } for(int j = p2 + 1; j <= a[i].k; j++) res += C(a[i].n, j), res %= mod; p2 = a[i].k; ans[a[i].id] = res; } for(int i = 1; i <= N; i++) cout << ans[i] << '\n'; return 0; }