Description
给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。
Input
输入第一行包含一个整数T,表示数据组数。
第2到第T+1行每行包含三个整数N、L和R,N、L和R的意义如题所述。
1≤N,L,R≤10^9,1≤T≤100,输入数据保证L≤R。
Output
输出包含T行,每行有一个数字,表示你所求出的答案对10^6+3取模的结果。
Sample Input
2
1 4 5
2 4 5
Sample Output
2
5
分析
lucas定理
代码
#include <bits/stdc++.h>
const int N = 1e9;
const int MOD = 1e6 + 3;
const int PHI = MOD - 1;
long long fac[MOD];
int read()
{
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-') f = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
void pre()
{
fac[0] = 1;
for (int i = 1; i < MOD; i++)
fac[i] = fac[i - 1] * i % MOD;
}
long long pow(long long x, int y)
{
long long res = 1;
while (y)
{
if (y & 1)
res = 1ll * x * res % MOD;
x = 1ll * x * x % MOD;
y >>= 1;
}
return res;
}
long long inv(int x)
{
return pow(x, PHI - 1);
}
long long lucas(int n,int m)
{
if (n < m)
return 0;
if (n < MOD && m < MOD)
return fac[n] * inv(fac[m]) % MOD * inv(fac[n - m]) % MOD;
return lucas(n / MOD, m / MOD) * lucas(n % MOD, m % MOD) % MOD;
}
int main()
{
pre();
int T = read();
while (T--)
{
int n = read(), x = read(), y = read();
printf("%lld\n", ((lucas(n + y - x + 1, y - x + 1) - 1) + MOD) % MOD);
}
}