法一、
在[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都是正整数,利用隔板法,因为是不等式,所以解的组数是CkR−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,
解的组数即CkR−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;
}