[BZOJ 4403]序列统计(Lucas定理)
Description
给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。
Solution
一个Lucas定理的模板
C(r-l+1+n,r-l+1)-1的推导:http://blog.csdn.net/lych_cys/article/details/50616439
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define Mod 1000003 using namespace std; typedef long long LL; int T,n,l,r; LL fac[Mod],inv[Mod]; void init() { fac[0]=1,inv[1]=1; for(int i=1;i<Mod;i++) fac[i]=(fac[i-1]*i)%Mod; for(int i=2;i<Mod;i++) inv[i]=((Mod-Mod/i)*inv[Mod%i])%Mod; inv[0]=1;//inv[0]此时表示的是0的阶乘的逆,所以这句一定要加! for(int i=1;i<Mod;i++) inv[i]=(inv[i-1]*inv[i])%Mod; } LL C(LL x,LL y) { if(x<y)return 0; if(x<Mod&&y<Mod)return ((fac[x]*inv[y])%Mod*inv[x-y])%Mod; else return (C(x/Mod,y/Mod)*C(x%Mod,y%Mod))%Mod; } int main() { init(); scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&l,&r); printf("%d\n",(C(r-l+1+n,r-l+1)-1+Mod)%Mod); } return 0; }