先解决一个类似题目的经典问题,给定区间 $[L, R]$,求满足 $L <= a_1 < a_2 < … < a_n <= R$ 的情况数目,n在合法范围内,可以直接得到答案是 $C_{R - L + 1} ^ {n} $
题目给出的不是严格递增的,所以需要转变成严格递增,这里只需要将第二个+1, 第三个+2,…,第n个+(n-1),这样相邻数字的差值最少是1,所以就成了严格递增。
这时候设为 ${b_n}$,满足 $L <= b_1 < b_2 < … < b_n <= R + n$,这时候就从区间 $[L, R + n]$ 种选取n个即可满足,所以答案就是 $C_{R + n - L}^{n}$
可是还没完,按照本题目,这里的n是从1到N的,所以总共有N种情况需要计算,那么最终的答案就是 $\sum_{i = 1}^n C_{R + i - L}^{i}$
直接枚举,范围是1e12,99.99999999999%概率凉凉,所以要继续化简/优化
杨辉三角的恒等式:$C_a^b = C_{a - 1}^{b} + C_{a - 1}^{b - 1}$
经过一系列操作,最后得到 $C_{R - L + N + 1}^{R - L + 1} - 1$
给定的p是质数,所以卢卡斯定理愉快解决。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e6 + 3;
int qpow(int a, int b, int mod){
int ans = 1;
while(b){
if(b & 1LL) ans = ans * a % mod;
a = a * a % mod;
b >>= 1LL;
}
return ans;
}
int c(int n, int m){
if(n < m) return 0;
int up = 1, down = 1;
for(int i = n, j = 1; i > n - m; i--, j++){
up = i % mod * up % mod;
down = down * j % mod;
}
return up * qpow(down, mod - 2, mod) % mod;
}
int Lucas(int n, int m){
if(n < m) return 0;
if(n < mod && m < mod) return c(n, m);
return Lucas(n / mod, m / mod) * c(n % mod, m % mod) % mod;
}
signed main(){
int n, l, r;
int t;
cin >> t;
while(t--){
cin >> n >> l >> r;
cout << (Lucas(r - l + n + 1, r - l + 1) + mod - 1) % mod << endl;
}
return 0;
}