TIJIE
2025-06-12 19:14:38
发布于:四川
6阅读
0回复
0点赞
#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;
}
这里空空如也







有帮助,赞一个