[bzoj4403]序列统计

插一块板表示让这个数字+1,问题转化为对于长度为1~n的序列,插入r-l块板(首尾也可以插板,每个点板数不限),有多少种方案,即求$\sum_{i=1}^{n}c(r-l+i,r-l)$
考虑该式,再补上一项c(r-l+1,r-l+1),原式=$\sum_{I=1}^{n}c(r-l+i,r-l)+c(r-l+1,r-l+1)-1=\sum_{I=2}^{n}c(r-l+i,r-l)+c(r-l+2,r-l+1)-1=……=c(r-l+n+1,r-l+1)-1$,用Lucas计算即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define mod 1000003
 4 int t,n,l,r,fac[mod],inv[mod];
 5 int c(int n,int m){
 6     if (n<m)return 0;
 7     return 1LL*fac[n]*inv[m]%mod*inv[n-m]%mod;
 8 }
 9 int main(){
10     scanf("%d",&t);
11     fac[0]=inv[0]=inv[1]=1;
12     for(int i=1;i<mod;i++)fac[i]=1LL*fac[i-1]*i%mod;
13     for(int i=2;i<mod;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
14     for(int i=2;i<mod;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
15     while (t--){
16         scanf("%d%d%d",&n,&l,&r);
17         l=r-l+1;
18         printf("%lld\n",(1LL*c((n+l)/mod,l/mod)*c((n+l)%mod,l%mod)+mod-1)%mod);
19     }
20 } 
View Code

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11280245.html