BZOJ 4403 序列統計

2022-05-11 11:34:49 字數 1581 閱讀 6436

給定三個正整數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 #include5

using

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的意義如題所述。...