Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98846 | CSYZShenJY | ssh | C++ | 运行超时 | 40 | 1000 MS | 5760 KB | 1667 | 2023-08-16 20:09:12 |
#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, sum[N], ins[N], f[N]; int mod(int x) { return (x % MOD + MOD) % MOD; } int ksm(int x, int n) { if (n == 0) { return 1; } else if (n % 2) { return mod(ksm(x, n - 1) * x); } int tmp = mod(ksm(x, n / 2)); return mod(tmp * tmp); } int C(int n, int m) { return mod(mod(sum[n] * ins[m]) * ins[n - m]); } signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> t; sum[0] = 1, ins[0] = 1; for (int i = 1; i <= 1e5; ++ i) { sum[i] = mod(sum[i - 1] * i); ins[i] = ksm(sum[i], MOD - 2); } 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); for (int i = 1; i <= maxn; ++ i) { f[i] = (i - 1) / block; } 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)) * ins[2]); } while (ik < a[i].k) { ans = mod(ans + C(in, ++ik)); } a[i].ans = ans; } sort(a + 1, a + t + 1, [](NODE X, NODE Y) { return X.id < Y.id; }); for (int i = 1; i <= t; ++ i) { cout << a[i].ans << '\n'; } }