FWT 一些问题
FWT 矩阵 C
矩阵计算方法:\(C_{x,i}\times C_{x,j}=C_{x,i\cdot j}\),其中 \(\cdot\) 为位运算。暴力跑值域 0,1,-1 的矩阵即可求得 \(C\)。也可以自己手动解方程。
记住要保证满秩。
\(C_{\operatorname{OR}}=\begin{bmatrix}1&0\\1&1\end{bmatrix},C_{\operatorname{OR}}^{-1}=\begin{bmatrix}1&0\\-1&1\end{bmatrix}\)
\(C_{\operatorname{AND}}=\begin{bmatrix}0&1\\1&1\end{bmatrix},C_{\operatorname{AND}}^{-1}=\begin{bmatrix}-1&1\\1&0\end{bmatrix}\)
\(C_{\operatorname{XOR}}=\begin{bmatrix}1&1\\1&-1\end{bmatrix},C_{\operatorname{XOR}}^{-1}=\begin{bmatrix}0.5&0.5\\-0.5&0.5\end{bmatrix}\)
FWT 的作用
每一维是独立的,也就是你可以:
- 随意确定维度之间的顺序。
- 随意确定每一维是什么卷积。
- FWT 两个循环都是可以以任意顺序进行的。
for(int i=0;i<W;i++)
for(int s=0,x,y;s<(1<<W);s++)
if(!(s>>i&1))
x=f[s],y=f[s|1<<i],
f[s]=(x*C[0][0]+y*C[0][1])%P,
f[s|1<<i]=(x*C[1][0]+y*C[1][1])%P;
- FWT 是线性变换。
这里,XOR 卷积的性质比较好。
- XOR 的 IFWT 等于 FWT 后乘上 \(2^{-W}\)。
- \(\mathtt{XORFWT}_t=\sum_{i=0}^{2^{W}-1} (-1)^{\operatorname{pop}(i\&t)}\times a_i\)。
所以我们进行一些 XOR 卷积的讨论。
CF2096H Wonderful XOR Problem
考虑 \(\mathtt{FWT}_t=\prod_{i=1}^n (\sum_{j=l}^r (-1)^{\operatorname{pop}(j\&t)})=\prod_{i=1}^n (f_{r,t}-f_{l-1,t})\)。
设 \(\operatorname{lowbit}_t=m\),有 \(f_{x,t}=\sum_{a,w,c} 2^{w-c}\sum_{j=0}^c (-1)^j\binom{c}{j}=\sum_{a,w,c}2^w[c=0]\),其中 \(a,w,c\) 代表 \(x\) 划分为若干个 \([a,a+2^w)\) 的分解,\(c\) 为 \(t\) 中 \([0,w)\) 位中 1 的个数。
先给 \(l,r\) 加一。
那么这个东西显然可以按照 \(m\) 分类,于是 \(\mathtt{FWT}_t=\prod_{i=1}^n (a_i(-1)^{\operatorname{pop}(r\&t)}+b_i(-1)^{\operatorname{pop}((l-1)\&t)})\),其中 \(a_i,b_i\) 是只保留 \(0\sim m\) 位的 \(r,l-1\)。
注意对于第 \(m\) 位他的系数是 \((-1)^{\operatorname{pop}((r-2^m)\& t)}\),所以若存在第 \(m\) 位就给他减掉 \(2^{m+1}\)。
转回去等于:\(\prod_{i=1}^{n} (a_ix^r+b_ix^{l-1})=\prod_{i=1}^n x^r(a_i+b_ix^{(l-1)\oplus r})\)。
\(x^r\) 等于全局偏移量,那么我们等于计算 \(\prod_{i=0}^{2^W-1}(a_i+b_ix^i)\),可以 FWT 维护。考虑我们 FWT 的时候需要维护 \(\mathsf{x,-x}\),实际上这个 - 的意义可以是 \(a_i-b_i\)。
将 FWT 修改一下,我们维护 \(f_s,g_s\) 分别表示 \(\mathsf{x,-x}\),转移的时候,\(g\) 的转移是对称的。复杂度 \(O(m^22^m)\)。
AT_abc367_g [ABC367G] Sum of (XOR^K or 0)
\(\mathtt{FWT}_t=\prod_{i=1}^n (1+(-1)^{\operatorname{pop}(a_i\& t)}y)=(1-y)^{A_t}(1+y)^{n-A_t}\)。
\(y\) 这一维我们做 \(\bmod\ y^{M}-1\) 的循环卷积。预处理 \((1-y)^i,(1+y)^i\),然后合并的时候求一下 \([y^0]\) 就好了。
复杂度 \(O(nm+2^Wm)\)。
P7526 Virtual Self
答案等于 \([y^m]\prod_{i=0}^{2^w-1}(\frac{(1+y)^{v_i}-(1-y)^{v_i}}{2}\times x^{i}+\frac{(1+y)^{v_i}+(1-y)^{v_i}}{2})\),其中 \(x\) 维做 xor 卷积,\(y\) 维做加法卷积。
进行 FWT,求出每个位置点值:
\(\mathtt{FWT}_i=\prod_{j=0}^{2^w-1}(\frac{(1+y)^{v_i}-(1-y)^{v_i}}{2}\times (-1)^{\operatorname{pop}(i\&j)}+\frac{(1+y)^{v_i}+(1-y)^{v_i}}{2})\)。
显然可以按照 \(\operatorname{pop}(i\&j)\) 奇偶性分类,得到:
\(\mathtt{FWT}_i=[y^m](1+y)^a(1-y)^{(\Sigma v)-a}=\sum_{i=0}^m (-1)^i\binom{a}{i}\binom{\Sigma v-a}{m-i}=a!\sum_{i=0}^m\frac{(-1)^i}{i!(m-i)!}\frac{(n-a)^{\underline{m-i}}}{(a-i)!}=\frac{a}{(\Sigma v)^{\underline a}}\sum_{i=0}^m \frac{(-1)^i}{i!(m-i)!}\frac{(\Sigma v)^{\underline{m+(a-i)}}}{(a-i)!}\)。
考虑到这个式子是关于 \(a\) 的 \(m\) 次多项式,那么可以求出前 \(m+1\) 项进行插值。(这个到卷积的转化我不太会啊,ctj 的)
求出每个位置的点值。最后代一遍 IFWT 即可。
CF1906K Deck-Building Game
我们可以考虑从 \(A\bigcup B=S\) 处分割成两个集合使得满足条件。
也就是 \(\bigoplus_{i\in S} a_i=0\),方案数是 \(2^{|S|}\)。
那么求 \(\prod (1+2x^{a_i})\),容易做啦。
CF1119H Triple
第一个转化,\(xu^{a_i}+yu^{b_i}+zu^{c_i}=u^{a_i}(x+yu^{a_i\oplus b_i}+zu^{a_i\oplus c_i})\)。
\(\mathtt{FWT}_t=\prod (x+y(-1)^{\operatorname{pop}(t\&b'_i)}+z(-1)^{\operatorname{pop}(t\&c'_i)})\)。
考虑计算 4 类的答案,设 \(cnt_{-1,-1}=a,cnt_{-1,1}=b,cnt_{1,-1}=c,cnt_{1,1}=d\)。
考虑:
- \(a+b+c+d=n\)。
- 将 \((b',c')\) 放入 \(o_{b'}\),得到 \(c+d-a-b\)。
- 将 \((b',c')\) 放入 \(o_{c'}\),得到 \(b+d-a-c\)。
- 将 \((b',c')\) 放入 \(o_{b'\oplus c'}\),得到 \(a+d-b-c\)。
解方程啦。
浙公网安备 33010602011771号