[bzoj4403]序列统计 Lucas定理

本文介绍了一个关于统计特定条件下单调不降序列数量的问题,并提供了一种有效的解决方案。输入包括多个测试用例,每个用例由三个整数组成,代表序列的最大长度、元素的最小值和最大值。文章给出了C++实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4403: 序列统计

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 759  Solved: 363
[ Submit][ Status][ Discuss]

Description

给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。

Input

输入第一行包含一个整数T,表示数据组数。
第2到第T+1行每行包含三个整数N、L和R,N、L和R的意义如题所述。
1≤N,L,R≤10^9,1≤T≤100,输入数据保证L≤R。

Output

输出包含T行,每行有一个数字,表示你所求出的答案对10^6+3取模的结果。

Sample Input

2
1 4 5
2 4 5

Sample Output

2
5
//【样例说明】满足条件的2个序列为[4]和[5]。

HINT

Source

 

求sigmaC(m+i-1,m-1) 1<=i<=N

即C(m+n,m-1)-1

#include<iostream>
#include<cstdio>
#define mod 1000003
using namespace std;
typedef long long ll;
int n,m,l,r,T;
ll fac[mod+5],infa[mod+5];
void init(){
	int i; fac[0] = infa[1] = infa[0] = 1;
	for( i = 1; i < mod; i++ ) fac[i] = fac[i-1]*i%mod;
	for( i = 2; i < mod; i++ ) infa[i] = (mod-mod/i)*infa[mod%i]%mod;
	for( i = 1; i < mod; i++ ) infa[i] = (infa[i]*infa[i-1])%mod;
}
ll C( int n, int m ){
	if( n < m ) return 0;
	if( n < mod && m < mod ) return fac[n] * infa[m] % mod * infa[n-m] % mod;
	else return C(n%mod,m%mod)*C(n/mod,m/mod)%mod;
}
int main(){
	init();
	scanf("%d", &T);
	while(T--){
		scanf("%d%d%d", &n, &l, &r);
		m = r - l + 1;
		printf("%lld\n",(C(m+n,n)+mod-1)%mod);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值