Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
98797 | CSYZDuZhenyu | ssh | C++ | 通过 | 100 | 608 MS | 5740 KB | 1521 | 2023-08-16 14:59:57 |
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 2e5+7; int t,lim,inv2,k,mod = 1e9+7; int mul[N],inv[N]; int pos[N],ans[N]; int n,m,now; struct sth { int n,m,id; }q[N]; bool cmp(sth a,sth b) { if(pos[a.n] == pos[b.n]) return a.m < b.m; return a.n < b.n; } int Pow(int a,int b) { int ret = 1; for(;b;b >>= 1) { if(b&1) ret = ret*a%mod; a = a*a%mod; } return ret; } void init(int n) { inv2 = Pow(2,mod-2); mul[0] = 1; for(int i = 1;i <= n;i++) mul[i] = mul[i-1]*i%mod; inv[n] = Pow(mul[n],mod-2); for(int i = n-1;i >= 0;i--) inv[i] = inv[i+1]*(i+1)%mod; } int C(int n,int m) { if(n < m) return 0; return mul[n]*inv[m]%mod*inv[n-m]%mod; } void addn() { now = (now+now-C(n,m))%mod; n++; } void deln() { now = (now+C(n-1,m))*inv2%mod; n--; } void addm() { now = (now+C(n,m+1))%mod; m++; } void delm() { now = (now-C(n,m))%mod; m--; } signed main() { init(1e5+2); scanf("%lld",&t); for(int i = 1;i <= t;i++) { scanf("%lld%lld",&q[i].n,&q[i].m); q[i].id = i; lim = max(lim,q[i].n); } int k = sqrt(lim); for(int i = 0;i <= lim;i++) pos[i] = i/k+1; sort(q+1,q+t+1,cmp); n = 0; m = 0; now = 1; for(int i = 1;i <= t;i++) { while(n < q[i].n) addn(); while(m > q[i].m) delm(); while(m < q[i].m) addm(); while(n > q[i].n) deln(); now = (now%mod+mod)%mod; ans[q[i].id] = now; } for(int i = 1;i <= t;i++) printf("%lld\n",ans[i]); return 0; }