题意
给定三个正整数 N 、 L N、L N、L和 R R R,统计长度在 1 1 1到 N N N之间,元素大小都在 L L L到 R R R之间的单调不降序列的数量。输出答案对 1 0 6 + 3 10^6+3 106+3取模的结果。
思路
考虑长度为
n
n
n,取值在
[
1..
m
]
[1..m]
[1..m]间的单调不降序列数量。
对于序列第
i
i
i个数,加上
i
−
1
i-1
i−1,可以转化成求单调上升序列的数量,就是取值为
[
1..
m
+
n
−
1
]
[1..m+n-1]
[1..m+n−1]的单调上升数量。
而这个方案数就为
(
n
m
+
n
−
1
)
\binom{n}{m+n-1}
(m+n−1n)
所以统计长度
1
∼
N
1\sim N
1∼N的答案就为
∑
i
=
1
n
(
i
m
+
i
−
1
)
\sum_{i=1}^{n}\binom{i}{m+i-1}
∑i=1n(m+i−1i),化简后得
(
m
n
+
m
)
−
1
\binom{m}{n+m}-1
(n+mm)−1
取值在
[
l
.
.
r
]
[l..r]
[l..r]间,让每个选择的数减去
l
−
1
l-1
l−1,就是
[
1..
r
−
l
+
1
]
[1..r-l+1]
[1..r−l+1]间。
具体:
代码
#include<cstdio>
#include<algorithm>
const int p = 1e6 + 3;
int n, m;
long long fra[p + 3];
int power(int a, int b) {
long long res = 1;
for (; b; b >>= 1) {
if (b & 1) res = res * a % p;
a = (long long)a * a % p;
}
return res;
}
long long C(long long n, long long m) {
if (n < m) return 0;
return fra[n] * power(fra[m], p - 2) % p * power(fra[n - m], p - 2) % p;
}
long long lucas(long long n, long long m) {
if (!m) return 1;
return C(n % p, m % p) * lucas(n / p, m / p) % p;
}
int main() {
int t, l, r;
scanf("%d", &t);
fra[0] = 1;
for (int i = 1; i <= p; i++)
fra[i] = fra[i - 1] * i % p;
while (t--) {
scanf("%d %d %d", &n, &l, &r);
m = r - l + 1;
printf("%lld\n", ((lucas(n + m, m) - 1) % p + p) % p);
}
}