题目链接
题意:给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。
题解:
一个新的套路:把单调不降问题转化为对于每个位置,让它的数值加上下标,从而转化成单调上升问题。
转化为单调上升之后,我们把
加上了
,那么问题就转化为了在
中选
个不同的数的方案数。
我们设
为
,那么答案就是
代码:
#include <bits/stdc++.h>
using namespace std;
int t;
long long n,r,l,fac[1000010],mod=1e6+3;
inline long long ksm(long long x,long long y,long long mod)
{
long long res=1;
while(y)
{
if(y&1)
res=(res*x)%mod;
x=(x*x)%mod;
y>>=1;
}
return res;
}
inline long long c(long long n,long long m)
{
if(m>n)
return 0;
return fac[n]*ksm((long long)fac[m]*fac[n-m]%mod,mod-2,mod)%mod;
}
inline long long lucas(long long n,long long m)
{
if(m>n)
return 0;
if(m==0)
return 1;
return (c(n%mod,m%mod)*lucas(n/mod,m/mod))%mod;
}
int main()
{
scanf("%d",&t);
fac[0]=1;
for(int i=1;i<mod;++i)
fac[i]=(fac[i-1]*i)%mod;
while(t--)
{
scanf("%lld%lld%lld",&n,&l,&r);
long long m=r-l+1;
printf("%lld\n",((lucas(m+n,n)-1)%mod+mod)%mod);
}
return 0;
}