码迷,mamicode.com
首页 > 其他好文 > 详细

位运算卷积

时间:2020-01-01 23:35:25      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:因此   bit   进制   其它   复杂   现在   一个   and   rac   

FWT

用来解决\(f(k)=\sum\limits_{i?j=k}g(i)*h(j)\)

本质思想与FFT是一样的,就是构造一个函数的“点值表达”,然后直接对“点值表达”做位运算卷积,然后再表示回来。

\(?=\operatorname{and}\)

利用性质\(i\operatorname{and}k=k\wedge j\operatorname{and}k=k\Leftrightarrow (i\operatorname{and}j)\operatorname{and}k=k\)
构造\(F(i)=\sum\limits_{j\operatorname{and}i=i}f(j)\)\(G,H\)同理。
\(G(k)H(k)=\sum\limits_{i\operatorname{and}k=k}g(i)\sum\limits_{j\operatorname{and}k=k}h(j)\)
\(=\sum\limits_{i\operatorname{and}j\operatorname{and}k=k}g(i)h(j)\)
\(=\sum\limits_{i\operatorname{and}k=k}f(i)=F(k)\)
因此我们可以先由\(g,h\)得到\(G,H\),然后计算\(F\),再得到\(f\)

那么我们的问题就变成了如何快速变换。
从低位往高位考虑,每一次遍历整个序列,把当前位为\(1\)的值加到其它位相同且当前位为\(0\)的值上去。
逆变换就是减。

\(?=\operatorname{or}\)

利用性质\(i\operatorname{or}k=k\wedge j\operatorname{or}k=k\Leftrightarrow (i\operatorname{or}j)\operatorname{or}k=k\)
构造\(F(i)=\sum\limits_{j\operatorname{or}i=i}f(j)\)\(G,H\)同理。
\(G(k)H(k)\)
\(=\sum\limits_{i\operatorname{or}k=k}g(i)\sum\limits_{j\operatorname{or}k=k}h(j)\)
\(=\sum\limits_{i\operatorname{or}j\operatorname{or}k=k}g(i)h(j)=\sum\limits_{i\operatorname{or}k=k}f(i)=F(k)\)
因此我们可以先由\(g,h\)得到\(G,H\),然后计算\(F\),再得到\(f\)

那么我们的问题就变成了如何快速变换。
从低位往高位考虑,每一次遍历整个序列,把当前位为\(0\)的值加到其它位相同且当前位为\(1\)的值上去。
逆变换就是减。

\(?=\operatorname{xor}\)

\(\operatorname{bit}(x)\)\(x\)的二进制数位和的奇偶性。
利用性质\(\operatorname{bit}(i\operatorname{and}k)\operatorname{xor}\operatorname{bit}(j\operatorname{and}k)=\operatorname{bit}((i\operatorname{xor}j)\operatorname{and}k)\)
构造\(F(i)=\sum\limits_j(-1)^{\operatorname{bit}(i\operatorname{and}j)}f(j)\)\(G,H\)同理。
\(G(k)H(k)=\sum\limits_i(-1)^{\operatorname{bit}(i\operatorname{and}k)}g(i)\sum\limits_j(-1)^{\operatorname{bit}(j\operatorname{and}k)}h(j)\)
\(=\sum\limits_{i,j}(-1)^{\operatorname{bit}((i\operatorname{xor}j)\operatorname{and}k)}g(i)h(j)\)
\(=\sum\limits_t(-1)^{\operatorname{bit}(t\operatorname{and}k)}\sum\limits_{i\operatorname{xor}j=t}g(i)h(j)\)
\(=\sum\limits_t(-1)^{\operatorname{bit}(t\operatorname{and}k)}f(t)=F(k)\)
因此我们可以先由\(g,h\)得到\(G,H\),然后计算\(F\),再得到\(f\)

那么我们的问题就变成了如何快速变换。
从低位往高位考虑,每一次遍历整个序列,当前位为\(0\)的下标为\(i\),其它位相同且当前位为\(1\)的下标为\(j\),那么\(A_i=a_i+a_j,A_j=a_i-b_j\)
逆变换就是\(a_i=\frac{A_i+A_j}2,a_j=\frac{A_i-A_j}2\)

FST

\(f(S)=\sum\limits_{T\subseteq S}g(T)h(S\setminus T)\)

现在有两个要求所以FWT不能直接做。我们把这个东西变成二维的。
\(f(S,i)=\sum\limits_{j=1}^i\sum\limits_{A\cup B=S}g(A,j)h(B,i-j)\)
其中\(f(S,i)\ne0\Rightarrow i=|S|\)
\(F(i,S)=\sum\limits_{T\operatorname{or}S=S}f(i,T)\)\(G,H\)同理。
那么我们可以得到\(F(k)=\sum\limits_{i+j=k}G(i)H(j)\)
因此我们可以先由\(g,h\)得到\(G,H\),然后暴力计算\(F\),再得到\(f\)
最后答案就是\(f(U,|U|)\)
复杂度为\(O(2^nn^2)\)别想着FFT了

位运算卷积

标签:因此   bit   进制   其它   复杂   现在   一个   and   rac   

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12130832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!