[bzoj4403]序列统计 Lucas定理

来源:互联网 发布:美工穿什么衣服 编辑:程序博客网 时间:2024/05/19 11:18

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 1000003using 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;}