模擬賽雜題

spdarkle發表於2024-11-03

模擬賽雜題

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\) 對所有的取到最值的點都提出限制)

那麼就有:

\[f_{l,r,k}=\sum_{x=l}^r\sum_{p<k,q\le k}f_{l,x-1,p}·f_{x+1,r,q} \]

可以透過字首和最佳化到 \(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\) 的指數

\[\begin{aligned} res&=\sum_{x<y}c(\gcd(b_xb_y,a_xb_y-a_yb_x))\\ &=\sum_{x<y}c(b_xb_y)-\min(c(b_xb_y),c(a_xb_y-a_yb_x))\\ &=\sum_x(n-1)·c(b_x)-\sum_{x<y}\min(c(b_x)+c(b_y),c(a_xb_y-a_yb_x))\\ &=\sum_x(n-1)·c(b_x)-\sum_{t=1}^{\lfloor\log_pV\rfloor}\sum_{x<y}[c(b_x)+c(b_y)\ge t\land c(a_xb_y-a_yb_x)\ge t]\\ \end{aligned} \]

前面那個可以 \(O(nw(V))\) 計算,其中 \(w(V)\) 是最多質因子個數,在 \(V=10^6\) 時取 \(7\)

問題化為高速計算

\[\sum_{t=1}^{\lfloor\log_pV\rfloor}\sum_{x<y}[c(b_x)+c(b_y)\ge t\land c(a_xb_y-a_yb_x)\ge t]\\ \]

不妨按照 \(c(b_x)\) 排序(以後的 \(x< y\) 預設為 \(c(b_x)\le c(b_y)\)

  1. 處理 \(\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\),分討有:

    1. \(t\le g_y\),這時候左右兩側都是零,可以直接算

    2. \(g_y<t\le g_x\),這時候右側是零,需要讓左側取到零,可以列舉 \(g_y\),另一半可以直接計算這樣的數字個數

    3. \(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\) 計算貢獻即可。

  2. \(\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)\)

前面是預處理複雜度。

若痕跡都不曾親眼見過

若連平凡都顯得像個傳說

還留什麼時間惋惜惶惑