1.题目链接。比较简洁的题意,其实题目也不难。首先总共会有R-L+1=m个数可以选择,我们假设当前序列的长度为k,那么每种数选择的数量是x_i则有:
就是求一下这个序列的非负整数解有多少个,显然有C(m+k-1,m-1)。然后答案就是:
然后采用:C(m,n-1)+C(m-1,n-1)=C(m,n)这个式子化简即可达到:ans=C(m+R-L+1,R-L+1).
求解这个数mod p的值,p是一个不是很大的素数,直接Lucas定理解决。
using namespace std;
const LL mod = 1e6 + 3;
LL fac[mod + 10];
LL exgcd(LL a, LL b, LL& x, LL& y)
{
if (!b)
{
x = 1;
y = 0;
return a;
}
LL ret = exgcd(b, a % b, y, x);
y -= a / b * x;
return ret;
}
LL Inv(LL a, LL mod)
{
LL x, y;
LL ret = exgcd(a, mod, x, y);
if (ret == 1) return (x % mod + mod) % mod;
return -1;
}
LL C(int n, int m, int mod)
{
if (m > n) return 0;
LL ret = fac[n];
ret *= Inv((fac[m] * fac[n - m]) % mod, mod);
return ret % mod;
}
LL Lucas(LL n, LL m, LL mod)
{
if (m == 0) return 1;
return C(n % mod, m % mod, mod) * Lucas(n / mod, m / mod, mod) % mod;
}
void init()
{
fac[0] = 1;
for (int i = 1; i <= mod; i++) fac[i] = (fac[i - 1] * i) % mod;//预处理阶乘
}
int main()
{
int T;
scanf("%d", &T);
init();
while (T--) {
int n, l, r;
scanf("%d%d%d", &n, &l, &r);
int m = (r - l + 1) - 1;
LL ans = Lucas(m + n + 1, m + 1,mod) - 1;
ans = (ans %mod + mod) % mod;
printf("%lld\n", ans);
}
}