那些年一起做過的數數題

記錄一些讓人眼前一亮或者非常經典有代表性、教育意義的計數題。

P1 ARC133F

給定正整數 \(N\),以及數列 \(A_0,A_1,A_2,...,A_N\)。你有 \(\frac{A_i}{10^9}\) 的概率使得初始的 \(x=i\)。然後你要做下面的操作 \(K\) 次。

  • \(\frac{x}{N}\) 的概率減 \(1\)
  • \(1-\frac{x}{N}\) 的概率加 \(1\)

求最後變成 \(y\) 的概率 \(\bmod 998244353\)

\(1\le N\le 10^5,0\le A_i,\sum A_i=10^9,1\le K\le 10^9\),輸入的所有數都是整數。

由此查看題解

P2 JOISC2020 Day2 遺蹟

由此查看題目

對於一個長度爲 \(2n\)\(1,2,...,n\) 中的每個數都恰好出現兩次的一個數列進行 \(n\) 次操作,每次選擇每個值中位置最靠後的保留,其餘減 \(1\),減到 \(0\) 即出局。
現在給定最後那些位置保留下來,求有多少個初始局面符合條件。
\(1\le n\le 600\).

神仙轉換。考慮從後往前枚舉每個位置是否保留以及最後的值,顯然如果從後往前考慮某個位置在某次被保留了,那麼對於前面的位置不可能頂替它。維護一個集合代表還有哪些數可以選擇,每次選擇不大於其初始高度的最大的值作爲最後的值。如果不存在,那麼它就是要寄了。

然後考慮計數。從後往前dp,把集合記進狀態裏。對於不保留的位置,它的高度可以在集合的一段前綴 \(0\) 裏選擇。這時我們先不考慮每個高度又兩個,把這兩個當做不同的選擇。設前綴 \(0\)\(j\) 個,在其之前已經有 \(CntBreak\) 個位置不保留,那麼就有 \(2j-(j+CntBreak)=j-CntBreak\) 種選法。然後考慮保留的情況。枚舉最後的高度 \(x>j\),計算 \(x\) 後面連着幾個 \(0\),假如是 \(k\),那麼就有 \(k+2\) 種選擇。

接下來考慮優化,嘗試只記錄 \(j\) 一個狀態。對於不保留的情況已經足夠了。否則考慮 \(x>j+1\),此時不會影響 \(j\) 的變換,先不填這個位置,也就是方案拖後計算。否則枚舉 \(k\) 代表可以把第二維擴展成 \(k\)。然後有 \(\binom{CntProtect-j}{k-1}\) 選法,\(i\)\(k+1\) 種填法。剩下 \(k-1\) 個數填 \(k-1\) 種數,互不相同,是一個獨立的問題也可以dp求。設 \(f[i,j]\) 代表 \(i\) 種數填 \(j\) 個位置。有轉移 \(f[i,j]=f[i-1,j]+f[i-1,j-1]\times j+f[i-1,j-2]\times j\times (j-1)\),然後相當於要用 \(f[k-1,k-1]\)

兩個dp,總複雜度 \(O(n^3)\)

P3 ABC214G

鏈接

二維完全錯排問題,給定排列 \(p,q\),問有多少個 \(r\) 滿足 \(r_i\ne p_i\and r_i\ne q_i\)

\(1\le n\le 3000\).

類似一維的錯排,考慮容斥,即欽定 \(k\) 個位置 \(r_i=p_i\or r_i=q_i\)。那麼我們考慮把值相同的下標連一條邊(神仙思路),然後對於每個連通塊分別計算答案再組合起來。對於只有一個點的連通只有一種選法。否則對於一個連通塊記 \(f[i,j]\) 代表大小爲 \(i\) 的環選 \(j\) 個位置。考慮給每條邊中間加一個點,即轉換爲找一個大小爲 \(j\) 的匹配。斷環成鏈,設選了一個位置相當於選了其後面的位置,那麼等價於在 \(2i-1\) 個位置中選 \(j\) 個不相鄰的。方案數爲 \(\binom{2i-1-j+1}{j}\)。強制選斷掉的那條邊,方案數爲 \(\binom{2i-j-1}{j-1}\)

把每個連通塊組合起來其實就是個揹包,具體可以看代碼。

Code

P4 ABC238Ex

由此查看題目和題解

P5 CF1470E

自動機類計數的典範了(

給定一個長度爲 \(n\) 的排列 \(p\),每次可以將一個區間 \([l,r]\) 反轉,代價是 \(r-l\)。不能反轉相交的區間,求代價不超過 \(m\) 的情況下字典序第 \(x\) 小的排列的第 \(y\) 個數。有 \(q\) 組詢問。

\(1\le n,q\le 5\times 5,0\le m\le 4.\)

查看題解

P6 Forgotten Land「NWRRC2018」

活在夢裏的題(找不到來源

集合+樹計數,容易被樹上連通塊(樹形揹包)帶偏。

給定 \(n\) 個點的樹,樹上每個點有一個顏色 \(c_u\)。求把樹劃分成若干個集合,每個集合的貢獻是一個關於集合內點以及集合任意兩點路徑上的點的顏色的並的顏色數量的函數。一個劃分的貢獻是左右集合的貢獻,求所有劃分的貢獻。

\(1\le n\le 5000, 1\le m\le 10.\)

題解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章