Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
98669 CSYZChenQX ssh C++ 通过 100 769 MS 3764 KB 1628 2023-08-16 12:16:19

Tests(10/10):


#include<bits/stdc++.h> using namespace std; typedef long long ll; const int MX = 1e5 + 5; int t, maxn, q; int ln, lk; ll p = 1e9 + 7, lans = 1, nans; ll mul[MX], inv[MX], ans[MX]; inline ll C(int x, int y) { if(x<y) return 0; return mul[x]*inv[y]%p*inv[x-y]%p; } struct node { int n, k, id; } s[MX]; bool cmp(node x, node y) { if(x.n/q==y.n/q) return x.k<y.k; return x.n<y.n; } int main() { scanf("%d", &t); for(int i=1; i<=t; i++) scanf("%d%d", &s[i].n, &s[i].k), maxn = max(maxn, s[i].n), s[i].id = i; q = sqrt(maxn); sort(s+1, s+t+1, cmp); mul[0] = inv[0] = inv[1] = 1; for(int i=1; i<=maxn; i++) mul[i] = mul[i-1]*i%p; for(int i=2; i<=maxn; i++) inv[i] = (p-p/i)*inv[p%i]%p; for(int i=1; i<=maxn; i++) inv[i] = inv[i-1]*inv[i]%p; int nn, nk, del; for(int i=1; i<=t; i++) { nn = s[i].n, nk = s[i].k; nans = lans; while(nn < ln) { nans = (nans - C(ln-1, lk+1) + C(ln, lk+1))*inv[2]%p; nans %= p; ln --; } while(nn > ln) { nans = nans*2 + C(ln, lk+1) - C(ln+1, lk+1); nans %= p; ln ++; } while(nk < lk) { nans = nans - C(ln, lk); nans %=p; lk --; } while(nk > lk) { nans = nans + C(ln, lk+1); nans %=p; lk ++; } lans = nans; ans[s[i].id] = (nans+p)%p; } for(int i=1; i<=t; i++) printf("%lld\n", ans[i]); return 0; }


测评信息: