100%AC点个赞
2025-07-14 18:37:41
发布于:上海
#include<bits/stdc++.h>
using namespace std;
int read(){
int a = 0; char c = getchar();
while(!isdigit(c)) c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48; c = getchar();
}
return a;
}
const int _ = 2.5e5 , MOD = 1e9 + 7 , T = sqrt() , INV2 = (MOD + 1) >> 1;
int jc[ + 3] , inv[_ + 3] , ans[_ + 3] , M[_ + 3] , N[_ + 3] , Q;
struct query{
int id , n , k;
}; vector < query > que;
bool operator <(query a , query b){return a.n / T == b.n / T ? a.k < b.k : a.n < b.n;}
int poww(long long a , int b){
int times = 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
}
void init(){
jc[0] = 1;
for(int i = 1 ; i <= _ ; ++i)
jc[i] = 1ll * jc[i - 1] * i % MOD;
inv[] = poww(jc[] , MOD - 2);
for(int i = _ - 1 ; i >= 0 ; --i)
inv[i] = 1ll * inv[i + 1] * (i + 1) % MOD;
}
int binom(int a , int b){return a < b || b < 0 ? 0 : 1ll * jc[a] * inv[b] % MOD * inv[a - b] % MOD;}
int main(){
init(); Q = read(); read();
for(int i = 0 ; i < Q ; i){
M[i] = read(); N[i] = read();
if(M[i] && N[i])
que.push_back((query){i , M[i] + N[i] , min(N[i] , M[i]) - 1});
}
sort(que.begin() , que.end());
int curN = 0 , curK = 0 , sum = 1;
for(auto t : que){
while(curN < t.n)
sum = (2ll * sum + MOD - binom(curN , curK)) % MOD;
while(curN > t.n)
sum = 1ll * INV2 * (sum + binom(--curN , curK)) % MOD;
while(curK < t.k)
sum = (sum + binom(curN , ++curK)) % MOD;
while(curK > t.k)
sum = (sum + MOD - binom(curN , curK--)) % MOD;
ans[t.id] = sum;
}
for(int i = 0 ; i < Q ; ++i)
printf("%lld\n" , (1ll * max(M[i] - N[i] , 0) * binom(M[i] + N[i] , M[i]) + ans[i]) % MOD * poww(binom(M[i] + N[i] , M[i]) , MOD - 2) % MOD);
return 0;
}
这里空空如也
有帮助,赞一个