成魔之路−> 算法提高课题解
思路:
L≤a1≤a2≤…≤ak≤R
差分映射:x1+x2+…+xk≤R−L,其中 xi≥0
令 yi=xi+1,则 y1+y2+…+yk≤R−L+k,其中 yi>0
隔板法(最后一个板子后面的元素不要选):CkR−L+k
N∑k=1CkR−L+k=N∑k=1CR−LR−L+k=CR−LR−L+1+CR−LR−L+2+…+CR−LR−L+N=CR−L+1R−L+1+CR−LR−L+1+CR−LR−L+2+…+CR−LR−L+N−1=CR−L+1R−L+N+1−1
最后运用 Lucas 定理求解 CR−L+1R−L+N+1−1
完整代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int p = 1e6 + 3;
int qmi(int a,int b,int p)
{
int res=1;
while(b)
{
if(b&1) res=(LL)res*a%p;
a=(LL)a*a%p;
b>>=1;
}
return res;
}
int C(int a,int b)
{
if(a<b) return 0;
int up=1,down=1;
for(int i=a,j=1;j<=b;i--,j++)
{
up=(LL)up*i%p;
down=(LL)down*j%p;
}
return (LL)up*qmi(down,p-2,p)%p;
}
int Lucas(int a,int b)
{
if(a<p&&b<p) return C(a,b);
return (LL)Lucas(a/p,b/p)*C(a%p,b%p)%p;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n,l,r;
cin>>n>>l>>r;
cout<<(Lucas(r-l+n+1,r-l+1)+p-1)%p<<endl;
}
return 0;
}