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