給定三個正整數n、l和r,統計長度在1到n之間,元素大小都在l到r之間的單調不降序列的數量。輸出答案對10^6+3取模的結果。
輸入第一行包含乙個整數t,表示資料組數。
第2到第t+1行每行包含三個整數n、l和r,n、l和r的意義如題所述。
1≤n,l,r≤10^9,1≤t≤100,輸入資料保證l≤r。
輸出包含t行,每行有乙個數字,表示你所求出的答案對10^6+3取模的結果。
21 4 5
2 4 525
//【樣例說明】滿足條件的2個序列為[4]和[5]。
因為可以相等,所以計數會不好處理
同樣,這道題要求最長不下降,那麼+i,轉為最長上公升子串行
範圍就變成[l+1,r+i],i為序列長度
顯然方案數是c(i,i+r-l)=c(r-l,i+r-l)
ans=∑c(k,i+k) k=r-l
但是n很大,o(n)都不能處理
但有c(k,n)+c(k+1,n)=c(k+1,n+1)
ans=c(k,1+k)+c(k,2+k).......c(k,n+k)
=c(1+k,1+k)-1+c(k,1+k)+c(k,2+k)
......c(k,n+k)
=c(1+k,2+k)-1+c(k,2+k)......c(k,n+k)
=c(1+k,3+k)-1.........
=c(1+k,n+k+1)-1
由於n,k很大,所以用lucas定理:c(m,n)=c(m%p,n%p)*c(m/p,n/p)
為了加速lucas,所以用了階乘逆元(**中的a),即a[i]=1/(i!)
b代表階乘
c(x,y)=b[y]*a[x]*a[y-x]%mod
逆元用線性模逆元公式
複雜度o(mod+logn)
1 #include2 #include3 #include4 #include5using
namespace
std;
6int mod=1000003;7
long
long b[1000005],a[1000005];8
long
long
ans;
9int
n,l,r;
10long
long lucas(int x,int
y)11
18int
main()
19 29
while (t--)
3035 }
BZOJ4403 序列統計
description 給定三個正整數n l和r,統計長度在1到n之間,元素大小都在l到r之間的單調不降序列的數量。輸出答案對10 6 3取模的結果。input 輸入第一行包含乙個整數t,表示資料組數。第2到第t 1行每行包含三個整數n l和r,n l和r的意義如題所述。output 輸出包含t行,...
BZOJ4403 序列統計
推導式子 baidu可得 設m r l 1 長度為i,元素大小在1 m之間的單調不降序列的數量有cm 1i m 1個 故答案為 n i 1 cm 1 i m 1 ni 1 cm 1i m 1 cm m 1 ni 2 cm 1i m 1 cm m 1 1 ni 3 cm 1i m 1 cm m 2 1...
BZOJ4403 序列統計
標籤 lucas定理,逆元 description 給定三個正整數n l和r,統計長度在1到n之間,元素大小都在l到r之間的單調不降序列的數量。輸出答案對10 6 3取模的結果。input 輸入第一行包含乙個整數t,表示資料組數。第2到第t 1行每行包含三個整數n l和r,n l和r的意義如題所述。...