法一、
在[L,R]中找出k个不降序的数,等价于在[0,R-L]中找出k个不降序的数,
即:$0<=a[1]<=a[2]<=a[3]<=…<=a[k]<=R-L$
=> 令$x[1]=a[1] , x[2]=a[2]-a[1] , x[i]=x[i]-x[i-1]$,使得$x[1]+x[2]+…+x[k]=a[k]<=R-L$,的解的组数,其中每个$x$都是非负整数
=> 令$y[i]=x[i]+1$,使得$y[1]+y[2]+…+y[k]=a[k]+k<=R-L+k$的解的组数,
其中每个$y$都是正整数,利用隔板法,因为是不等式,所以解的组数是$C^{k}_{R-L+k}$
法二、
令$b[1] = a[1] , b[2] = a[2] + 1$ , $b[3] = a[3] + 2 , … , b[i] = a[i] + i - 1$,
那么原不等式就转换成严格小于的形式:$L <= b[1] < b[2] < b[3] < … < b[k] <= R+k-1$,
解的组数即$C^{k}_{R-L+k}$ ,
枚举k,最终结果是 $ΣC_{k}^{R-L+k}$ , 化简后: $C_{R-L+n+1}^{R-L+1}+1$
#include <iostream>
using namespace std;
typedef long long LL;
const int p = 1e6 + 3;
int qmi(int a , int b)
{
int res = 1;
while(b)
{
if(b & 1) res = (LL) res * a % p;
b >>= 1;
a = (LL) a * a % p;
}
return res;
}
int C(int a, int b)
{
if (a < b) return 0;
int down = 1, up = 1;
for (int i = a, j = 1; j <= b; i --, j ++ )
{
up = (LL)up * i % p;
down = (LL)down * j % p;
}
return (LL)up * qmi(down, p - 2) % p;
}
int lucas(int a , int b)
{
if(a < p && b < p) return C(a , b);
return (LL)lucas(a / p , b / p) * C(a % p , b % p) % p;
}
int main()
{
int T;
cin >> T;
int l , r , n;
while(T--)
{
cin >> n >> l >> r;
cout << (lucas(r - l + n + 1 , r - l + 1) + p - 1) % p << endl;
}
return 0;
}