用来解决\(f(k)=\sum\limits_{i?j=k}g(i)*h(j)\)。
本质思想与FFT是一样的,就是构造一个函数的“点值表达”,然后直接对“点值表达”做位运算卷积,然后再表示回来。
利用性质\(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\)的值上去。
逆变换就是减。
利用性质\(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{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\)。
\(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了
原文:https://www.cnblogs.com/cjoierShiina-Mashiro/p/12130832.html