Bzoj4403 序列统计

Posted SilverNebula

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bzoj4403 序列统计相关的知识,希望对你有一定的参考价值。

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 566  Solved: 270
[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的意义如题所述。

Output

输出包含T行,每行有一个数字,表示你所求出的答案对106+3取模的结果。

Sample Input

21 4 52 4 5

Sample Output

25

HINT

 

提示

【样例说明】满足条件的2个序列为[4]和[5]。

【数据规模和约定】对于100%的数据,1≤N,L,R≤10^9,1≤T≤100,输入数据保证L≤R。

 

Source

 
 
数学问题 组合数 lucas定理
 
设m=R-L+1,即可用的数值的数量
推一波公式,得到答案就是C(n+m,m)-1,用lucas定理算出来即可
 
蜜汁WA2次之后直接把int全开成LL,就蜜汁过了
 
 
 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<vector>
 8 #define LL long long
 9 using namespace std;
10 const int mod=1e6+3;
11 const int mxn=1000010;
12 int read(){
13     int x=0,f=1;char ch=getchar();
14     while(ch<0 || ch>9){if(ch==-)f=-1;ch=getchar();}
15     while(ch>=0 && ch<=9){x=x*10+ch-0;ch=getchar();}
16     return x*f;
17 }
18 LL pw[mxn],inv[mxn];
19 void init(){
20     pw[0]=1;inv[1]=1;
21     pw[1]=1;inv[0]=1;
22     for(int i=2;i<mxn;i++){
23         pw[i]=(LL)pw[i-1]*i%mod;
24         inv[i]=((-(mod/i)*(LL)inv[mod%i])%mod+mod)%mod;
25     }
26     return;
27 }
28 LL calc(int n,int m){
29     if(n<m)return 0;
30     int res=(LL)pw[n]*inv[pw[m]]%mod*inv[pw[n-m]]%mod;
31     return res;
32 }
33 LL lucas(LL n,LL m){
34     if(!m)return 1;
35     return calc(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
36 }
37 int T,n,m,L,R;
38 int main(){
39     int i,j;
40     T=read();
41     init();
42     while(T--){
43         n=read();L=read();R=read();
44         m=R-L+1;
45         int ans=lucas((LL)n+m,m)-1;
46         if(ans<0)ans+=mod;
47         printf("%d\n",ans);
48     }
49     return 0;
50 }

 

 

以上是关于Bzoj4403 序列统计的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ4403 序列统计

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

Bzoj4403 序列统计

bzoj 4403: 序列统计

序列统计(bzoj 4403)

[BZOJ 4403]序列统计