题目概述
给定三个正整数
N,L,R
,统计长度在
1
到
解题报告
先考虑长度为
n
方案数。假设现在选好了
那么答案就是 ∑ni=1(m+i−1m−1) 。
添上一个
(mm)
,由于
(xy)=(x−1y−1)+(x−1y)
,所以可以得到:
(m+n−1m−1)+(m+n−2m−1)+⋯+(mm−1)+(mm)=(m+n−1m−1)+(m+n−2m−1)+⋯+(m+1m−1)+(m+1m)=⋯=(m+nm)
即答案为 (m+nm)−1 。然后看到了可怕的 109 ……而 106+3 是个素数,直接Lucas定理+乘法逆元。
示例程序
#include<cstdio>
using namespace std;
typedef long long LL;
const int MOD=1000003;
int te,n,L,R,fac[MOD+5],INV[MOD+5];
void Make()
{
fac[0]=INV[0]=INV[1]=1;for (int i=2;i<MOD;i++) INV[i]=MOD-(LL)(MOD/i)*INV[MOD%i]%MOD;
for (int i=1;i<MOD;i++) fac[i]=(LL)fac[i-1]*i%MOD,INV[i]=(LL)INV[i-1]*INV[i]%MOD;
}
#define C(x,y) ((x)<(y)?0:((LL)fac[(x)]*INV[(y)]%MOD*INV[(x)-(y)]%MOD))
inline int Locas(int x,int y) {int ans=1;while (y) ans=(LL)ans*C(x%MOD,y%MOD)%MOD,x/=MOD,y/=MOD;return ans;}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
for (Make(),scanf("%d",&te);te;te--)
{
scanf("%d%d%d",&n,&L,&R);
printf("%d\n",(Locas(R-L+1+n,n)+MOD-1)%MOD);
}
return 0;
}