4403: 序列统计
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 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
1 4 5
2 4 5
Sample Output
2
5
//【样例说明】满足条件的2个序列为[4]和[5]。
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;
}