ccz181078

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

Description

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

Input

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

Output

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

转化为求(C(n,r-l+1+n)-1)%1000003的值,用lucas定理求组合数即可。

#include<cstdio>
typedef long long lint;
lint f[1000005];
const int P=1000003;
int t,n,l,r;
lint power(lint x,int n){
    if(!n)return 1;
    lint c=power(x,n>>1);
    if(n&1)return c*c%P*x%P;
    return c*c%P;
}
lint C(int a,int b){
    if(a>b)return 0;
    if(a<P&&b<P)return f[b]*power(f[a]*f[b-a]%P,P-2)%P;
    return C(a/P,b/P)*C(a%P,b%P)%P;
}
int main(){
    f[0]=1;
    for(int i=1;i<P;i++)f[i]=f[i-1]*i%P;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&n,&l,&r);
        printf("%lld\n",(C(n,r-l+1+n)+P-1)%P);
    }
    return 0;
}

 

posted on 2016-03-04 17:29  nul  阅读(178)  评论(0编辑  收藏  举报