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

 

posted @ 2017-05-07 15:33  Zars19  阅读(256)  评论(0编辑  收藏  举报