给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。
标签:cas .net sam ons 正整数 while 条件 namespace amp
给定三个正整数N、L和R,统计长度在1到N之间,元素大小都在L到R之间的单调不降序列的数量。输出答案对10^6+3取模的结果。
输出包含T行,每行有一个数字,表示你所求出的答案对10^6+3取模的结果。
http://blog.csdn.net/qq_34025203/article/details/50920189
线性求逆元证明:其中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 }
标签:cas .net sam ons 正整数 while 条件 namespace amp
原文地址:http://www.cnblogs.com/keximeiruguo/p/7811900.html