先判掉 \(a=b\) 的情况,那么有充要条件(\(\otimes\) 表示按位与):
- \(\forall i,a_i\otimes b_i=b_i\)
- \(\exists p,p_i\otimes b_i=b_i\)
对于 \(1\) 条件的必要性显然,如果一个位置为 \(0\) 那么在只有按位与的情况下永远不可能变成 \(1\)。而对于条件 \(2\),如果不存在这样的一个排列 \(p\),那么对于所有的 \(p\) 至少存在一个位置 \(p_i\) 为 \(0\) 而 \(b_i\) 对应位置为 \(1\)。
而对于充分性,我们考虑d对于目前已经合法的 \(p\),那么一定有 \(b_i\leq p_i\)。那么我们找目前的 \(a_i\neq b_i\),找到对应的 \(p_j=b_i\),将 \(p_j\) 与 \(p_i\) 交换操作即可。发现 \(a_i\) 调整为 \(b_i\),而其它位置不变。是因为有 \(p_j\otimes b_j=b_j\),而 \(p_j=b_i,p_i\otimes b_i=b_i\) 故 \(p_i\otimes p_j=p_j\),那么交换一定不会带来任何其它位置从 \(1\) 变 \(0\) 的问题。
考虑网络流,连边 $\forall i\in [0,n),S\rightarrow i $,边权为 \(1\),后连边 $ b_i\rightarrow T$,边权为 \(1\)。那么我们的中间希望能够让每一个 \(b_i\) 都流向一个能够包含自己的 \(i\)。我们只需要对于每一个 \(i\) ,若 \(i\otimes 2^k=1\),则连边 \(i\rightarrow i-2^k\),边权为 \(+\infty\)。