模擬賽雜題
18th D
我認為較長時間應當可以獨立完成。比較綜合的計數題。
考慮一個簡化的問題,如何計數一個序列的本質不同子序列。
考慮模擬子序列匹配的過程,每一位字元都找到最近的可以匹配的進行匹配
這告訴我們,如果對於兩個字元 \(i,j\),\(a_i=a_j\),且 \([i+1,j-1]\) 之間沒有任何字元,那麼選取 \(i\) 與選取 \(j\) 是等價的。
可以考慮一個 \(dp\),設 \(f_{i}\) 為當前最後一個字元匹配到了 \(i\) 的本質不同子序列個數。
則設 \(p\) 為 \([1,i-1]\) 裡 \(a_p=a_i\) 的最大 \(p\),如果不存在則為零,則 \(f_i=\sum_{j=p}^{i-1}f_j\),\(f_0=1\)
可以 \(O(n)\) 做。
那麼擴充套件到這裡,我們考慮每個元素的消失時間 \(t\),也相當於是 \(a_i=a_j\),則在這倆元素首次消失一個的時候,這時候兩元素中間如果沒有存在的元素,則必會導致重複。
也就是必須有 \(\max_{x\in [i+1,j-1]} t_{x}> \min(t_i,t_j)\),如果兩個都要保留。
那麼還有中間這時候已經刪空,那麼我們保留其中一個,讓它繼續存活,不妨欽定保留靠後的一個,也就是欽定 \(t_i\ge t_j\) 吧。
所以我們需要要求存在 \(k\) 的時刻就有 \(t_i<t_j\)。
轉化一下描述,就是:
\(\forall i<j,a_i=a_j,t_i<t_j,\exists k,i<k<j,a_k\neq a_i,t_k>t_i\)
這東西保證了子序列匹配過程中的唯一解,所以是充分的(很直覺顯然)
繼續轉化為一個更簡潔的描述,就有:
\(\forall i\),設 \(k\) 是其後面第一個大於 \(i\) 的元素,則必須有 \(t_k\neq t_i\)
考慮直接區間 dp,設 \(f_{l,r,x}\) 為區間 \(l,r\),最大值為 \(x\),且 \(t_{r+1}>x\) 的方案數,為了便於記錄不妨令 \(a_{m+1}=0,t_{m+1}=n+1\)
至於對於多個取到最值的點,我們欽定為最小的一個進行劃分(\(r+1\) 對所有的取到最值的點都提出限制)
那麼就有:
可以透過字首和最佳化到 \(O(nm^3)\)。
考慮到本質不同的 \(t\) 至多有 \(m+1\) 個,我們不妨設 \(g_i\) 為至多使用 \(i\) 個不同的 \(t\) 的方案數,這顯然與 \(\sum_{j=1}^i f_{1,m,j}\) 等價(因為我們保證了最大值是取到了的)
再設 \(f_i\) 為恰好用 \(i\) 個不同的 \(t\) 的方案數,可以被 \(g\) 二項式反演出來。
則答案就是 \(\sum f_i{n\choose i}\)
19th D
同 P4352
感覺很自然的,主要是場上沒看這題
首先在足夠多次正著和反著操作後所有值會變成一樣,每次操作不會增大相鄰兩個元素的高度差,合併的時刻至多 \(n\) 個,我們考慮加速這個過程。
首先合併相同值,然後就可以透過判斷左右側的值判斷左側操作/右側操作當前段是否會增高,不妨設這個為 \(g_{i,0/1}\)
然後考慮第 \(i\) 段與第 \(i-1\) 段的相對變化,設 \(a=[g_{i,0}\neq g_{i-1,0}],b=[g_{i,1}\neq g_{i-1,1}]\),則經過 \(x\) 輪左側操作和 \(y\) 輪右側操作後其高度差縮小為 \(ax+by\),合併時刻就是找到 \(ax+by=\Delta h\) 的第一個時刻。
我們將這個時刻存入優先佇列,取出時間最小的時刻,合併兩個段,並且重構兩側關係(\(g\) 可以直接 \(0\) 取左側的,\(1\) 取右側的)。支援優先佇列延遲刪除就好了。
至於 \(ax+by\) 只有 \(x,y,x+y\) 兩種可能,同時我們需要解決的是在時刻 \(t\) 之後的最近時刻,可以列出式子,最後就是對 \(x,y,x+y\) 其中之一的限制條件,可以透過桶來解決。
同時由於最大有效時刻不超過 \(m\),所以可以開 \(m\) 個 queue
替代優先佇列,時間複雜度就線性了(使用連結串列的話)
21th D
這一週唯一在考場想到正解的D,這裡的想到指的是完整思路,雖然並沒有寫
首先考慮更項減損數,那麼就會有 $\gcd $ 只與小數部分有關,因此可以先將 \(a\) 對 \(b\) 取模(如果為零取 \(b\),這方便處理邊界)。
考慮對於每個質因子的貢獻,設當前統計質因子 \(p\),\(c(x)\) 為質因子分解後 \(p\) 的指數
前面那個可以 \(O(nw(V))\) 計算,其中 \(w(V)\) 是最多質因子個數,在 \(V=10^6\) 時取 \(7\)。
問題化為高速計算
不妨按照 \(c(b_x)\) 排序(以後的 \(x< y\) 預設為 \(c(b_x)\le c(b_y)\))
-
處理 \(\min(c(b_x),c(b_y))\ge 1\)
\[\sum_{t=1}^{\lfloor\log_pV\rfloor}\sum_{x}\sum_{y<x,c(b_y)+c(b_x)\ge t}[a_xb_y\equiv a_yb_x(\bmod p^t)] \]我們令 \(g_x=c(b_x)\),令 \(h_x=\frac{b_x}{p^{g_x}}\),這樣 \(h_x\) 與 \(p^t\) 就互質了,相當於求。
\[\sum_{t=1}^{\lfloor\log_pV\rfloor}\sum_{x}\sum_{y<x,c(b_y)+c(b_x)\ge t}[a_xp^{g_y}(h_x)^{-1}\equiv p^{g_x}a_y(h_y)^{-1}(\bmod p^t)] \]由於 \(g_y\le g_x\),分討有:
-
\(t\le g_y\),這時候左右兩側都是零,可以直接算
-
\(g_y<t\le g_x\),這時候右側是零,需要讓左側取到零,可以列舉 \(g_y\),另一半可以直接計算這樣的數字個數
-
\(g_x<t\),這時候原式可以等效為
\([a_x(h_x)^{-1}\equiv p^{g_x-g_y}a_y(h_y)^{-1}(\bmod p^{t-g_y})]\)
我們只需要對於每個 \(y\) 列舉 \(g_x\),開桶加入貢獻,然後對於每個 \(x\) 列舉 \(g_y\) 計算貢獻即可。
-
-
\(\min(c(b_x),c(b_y))=0\),則 \([a_xb_y\equiv a_yb_x(\bmod p^t)]\),顯然由於 \(\gcd(b_y,p^t)=1\),則將 \(b_x\) 寫為 \(h_x·p^{g_x}\) 又有:
\([a_x(h_x)^{-1}\equiv a_y(b_y)^{-1}p^{g_x}(\bmod p^t)]\)
由於 \(g_x+g_y\ge t,g_y=0\implies g_x\ge t\) 所以右側為零,因此只需要判斷左側是否為零即可。
至此本題完結。
複雜度應當是 \(O(V\log\log V+n\frac{\sqrt V}{\ln V}+nw(V)\log^2 V)\)
前面是預處理複雜度。
若痕跡都不曾親眼見過
若連平凡都顯得像個傳說
還留什麼時間惋惜惶惑