0
点赞
收藏
分享

微信扫一扫

BZOJ-4403: 序列统计 (Lucas+排列组合)

猎书客er 2022-09-16 阅读 33

4403: 序列统计

Time Limit: 3 Sec  Memory Limit: 128 MB

Submit: 1021  Solved: 477

[​​Submit​​​][​​Status​​​][​​Discuss​​]

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
//【样例说明】满足条件的2个序列为[4]和[5]。

HINT

 

Source


线性求逆元证明:

BZOJ-4403: 序列统计 (Lucas+排列组合)_数据

其中ak+b=mod  --->  k=mod/a b=mod%a 所以1/a=-(p/a)*inv[p%a]

 

1 #include "bits/stdc++.h"
2 using namespace std;
3 typedef long long LL;
4 const int mod=1e6+3;
5 LL fac[mod],inv[mod];
6 void init(){
7 int i,j;
8 fac[0]=inv[1]=inv[0]=1;
9 for (i=1;i<mod;i++) fac[i]=fac[i-1]*i%mod;
10 for (i=2;i<mod;i++) inv[i]=(mod-mod/i)*inv[mod%i]%mod;
11 for (i=1;i<mod;i++) inv[i]=inv[i]*inv[i-1]%mod;
12 }
13 inline long long Lucas(int n,int m){
14 if (n<m) return 0;
15 if (n<mod && m<mod) return fac[n]*inv[m]%mod*inv[n-m]%mod;
16 return Lucas(n/mod,m/mod)*Lucas(n%mod,m%mod)%mod;
17 }
18 int main(){
19 freopen ("count.in","r",stdin);freopen ("count.out","w",stdout);
20 int i,j,t,n,L,R;
21 init();
22 scanf("%d",&t);
23 while (t--){
24 scanf("%d%d%d",&n,&L,&R);
25 int len=R-L+1;
26 printf("%d\n",(Lucas(n+len,len)+mod-1)%mod);
27 }
28 return 0;
29

 

 

 

 


举报

相关推荐

0 条评论