一種關於子集異或和的冷門反演
阿新 • • 發佈:2022-12-09
前言
本文用集合的符號表示二進位制數。具體地,定義全集 \(u\) 是 \(2^n-1\),某個二進位制數 \(x\) 第 \(t\) 位是 1 可以理解為為 \(x\) 中有 \(t\) 號元素,否則沒有。定義 \(|x|\) 代表的不是二進位制數的絕對值,而是 1 的個數。\(x \subseteq y\) 當且僅當 \(x\& y = x\) 。其它符號類似。
一類問題
對於一個數列 \(b\) ,定義它的一種變換是 \(B_i = \bigoplus\limits_{j \subseteq i}{b_j}\) 現在給出 \(\{B_i\}\) ,求 \(\{b_i\}\) 。
一個恆等式
解決
基於上面的恆等式設計一種反演(按位與對異或有分配律):
\[\begin{align*} b'_i &= \bigoplus\limits_{j \subseteq i}{((u - i) \oplus j)\&B_j} & &(\ast)\\ &= \bigoplus\limits_{j \subseteq i}{\left[((u - i) \oplus j)\&\bigoplus\limits_{t\subseteq j}{b_t}\right]}\\ &= \bigoplus\limits_{t \subseteq i}{\left[b_t\&\bigoplus\limits_{t\subseteq j\subseteq i}{((u - i) \oplus j)}\right]}\\ &= b_i\oplus\left(\bigoplus\limits_{k=0}^{|u|}{2^k\&i\&b_{i-2^k}}\right) \end{align*} \]其中的 \((\ast)\)
下面的問題是怎麼把 \(b'\) 後面拖著的尾巴去掉,把它變回 \(b\) 。注意到 \(i-2^k < i\) ,所以按照從小到大的順序還原 \(b\) ,當處理到 \(b_i\) 時直接列舉 \(i\) 的所有二進位制位進行一個異或,就把後面消掉了,時間複雜度依然是 \(\Theta(n\log n)\) 。
應用
感覺沒用。誰哪天用上了記得v我50。