給出乙個 \(n × m\) 大小的矩形,每個位置可以填上 \([1, c]\) 中的任意乙個數,要求填好後任意兩行互不等價且任意兩列互不等價,兩行或兩列等價當且僅當對應位置完全相同,求方案數 。
\(n, m \le 5000\)
這題是 wearry 出的神題,根本不會做。。。把題解搬過來了。
首先我們有乙個很簡單的方式使得列之間互不等價,對於任意一列,總方案數是 \(c^n\) , 那麼使得列與列之間互不相同的方案數為 \(^}\) 。
接下來的問題只與行數有關 , 定義 \(g(n)\) 表示 \(n\) 行不保證每行互不等價的方案數 , \(f(n)\) 表示 \(n\) 行保證任意兩行互不等價的方案數 , 有 :
\[\begin
g(n) &= ^}\\
&= \sum_^ f(i)\\
\end
\]考慮這個式子的意義,就是列舉了有幾行是不同的,然後將 \(n\) 行分成這 \(i\) 種不同的行(每個非空)的方案。
然後考慮斯特林反演就行了。(此處指不帶符號的第一類斯特林數)
\[\begin
g(n) &= \sum_^ f(i) \\
\leftrightarrow
f(n) &= \sum_^ (-1)^ \beginn\\ i\end g(i)
\end
\]然後在 \(o(nm)\) 的時間裡求出第一類斯特林數,就可以做完了。
其實還有更快的求法,但是對於這題原來資料沒有必要。
見此部落格 orz orz 生成函式大師 sunwayshichenglight 。
瓶頸在分治 \(ntt\) 處理下降冪那裡,可以優化到 \(o(n \log^2 n)\) 。
對於行列計算方案的題,常常可以考慮列舉一維,用容斥或者斯特林反演做。
對於另外一維可以快速計算可行的方案,來除掉一維的限制。
自己寫
斯特林數 斯特林反演
第一類stirling數 s n,m 也可記為 beginn m end 第一類stirling分為無符號第一類stirling數 s u n,m 和帶符號第一類stirling數 s s n,m 他們分別表現為其公升階函式和降階函式的各項係數,形式如下 x x cdot x 1 cdot x 2 ...
二項式反演 斯特林數 斯特林反演 學習筆記
從錯排數講起,考慮乙個有n個元素的排列,若乙個排列中所有的元素都不在自己原來的位置上,那麼這樣的排列就稱為原排列的乙個錯排。用容斥來解決這個問題,不難發現錯排數即為g n i 1n 1 i ni n i 考慮二項式定理,1 1 n i 0n 1 i ni 0 上式當n 0時值為1,所以有 i 0n ...
知識點簡單總結 斯特林數 斯特林反演
第一類斯特林數 n 元置換分解為 k 個獨立輪換的方案數,即 begin n k end n 1 begin n 1 k end begin n 1 k 1 end.第二類斯特林數 n 個元素分成 k 個非空集合的方案數,即 begin n k end k begin n 1 k end begin...