1. 程式人生 > 其它 >一種關於子集異或和的冷門反演

一種關於子集異或和的冷門反演

前言

本文用集合的符號表示二進位制數。具體地,定義全集 \(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\}\)

一個恆等式

\[\bigoplus\limits_{t\subseteq y\subseteq x}{((u-x)\oplus y)} = \begin{cases} u, &t=x\\ 0, &|t| < |x|-1\\ t\oplus x, &|t| = |x|-1 \end{cases} \]

解決

基於上面的恆等式設計一種反演(按位與對異或有分配律):

\[\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_i\}, \{i\& B_i\}\) 兩個數列進行高維字首和預處理來做到 \(\Theta(n\log n)\) 求得。

下面的問題是怎麼把 \(b'\) 後面拖著的尾巴去掉,把它變回 \(b\) 。注意到 \(i-2^k < i\) ,所以按照從小到大的順序還原 \(b\) ,當處理到 \(b_i\) 時直接列舉 \(i\) 的所有二進位制位進行一個異或,就把後面消掉了,時間複雜度依然是 \(\Theta(n\log n)\)

應用

感覺沒用。誰哪天用上了記得v我50。