解法:
首先,我们设表示满足条件的序列中,长度为i,最后一个数字为L+j-1的序列个数。
那我们就可以得到一下递推式: (其中对于每一个f[1][n]或者f[n][1]其值都为1),
近一步推到 .
且我们所要求的答案是 .
我们考虑化简答案的式子,由递推式得:,
所以原答案式= .
= .
又由 得,原式=
接下来引出一个结论:,
以下是证明: 在一个正方形中,对于每一条从(1,1)走到(i,j)的最短路,(相邻格子移动那种)都可以把第i行的最后一个经过的点的纵坐标,看作是序列的第i位的值,而这样的最短路方案数正是,且符合
的定义。
所以综上,答案为.
(哇。。。。我自己都觉得我的解题思路好烦啊。。。。)
Code:
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define rep2(i,j,k) for(int i=j;i>=k;i--)
#define mo 1000003
using namespace std;
template<typename T> void read(T &num){
char c=getchar();num=0;T f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
num*=f;
}
template<typename T> void qwq(T x){
if(x>9)qwq(x/10);
putchar(x%10+'0');
}
template<typename T> void write(T x){
if(x<0){x=-x;putchar('-');}
qwq(x);putchar('\n');
}
int powe[1000010];int inv[1000010];
inline int poww(int n,int m){
int re_value=1;int temp=n;int tmp=m;
while(tmp){
if(tmp&1)re_value=(1ll*re_value*temp)%mo;
temp=(1ll*temp*temp)%mo;
tmp>>=1;
}
return re_value;
}
inline void Pretreatment(){
powe[0]=powe[1]=inv[0]=inv[1]=1;
rep(i,2,mo-1){powe[i]=(1ll*powe[i-1]*i)%mo;}
inv[mo-1]=poww(powe[mo-1],mo-2);
rep2(i,mo-2,2){inv[i]=(1ll*inv[i+1]*(i+1))%mo;}
return;
}
inline int C(int n,int m){
if(n<m)return 0;
return (1ll*((1ll*powe[n]*inv[m])%mo)*inv[n-m])%mo;
}
inline int Lucas(int n,int m){
if(!m||n==m)return 1;
return (1ll*C(n%mo,m%mo)*Lucas(n/mo,m/mo))%mo;
}
int main(){
int T;read(T);
Pretreatment();
while(T--){
int N,L,R;read(N);read(L);read(R);
int K=R-L+1;
write((Lucas(N+K,N)-1+mo)%mo);
}
return 0;
}