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}\)
\(\mathtt{ORFWT}\) 等价于高维前缀和。逆变换等价于高维前缀差分。
\(\mathtt{ANDFWT}\) 等价于高维后缀和。逆变换等价于高维后缀差分。
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;
- 更快的枚举:
for(int i=1;i<(1<<W);i<<=1)
for(int j=i;j<(1<<W);++j|=i)
mango(f[j],f[j-i]);
- 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 的个数。这里还有一个 \(-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}(c_i+d_ix^i)\),可以 FWT 维护。
考虑我们 FWT 的时候需要用到 \(\mathsf{x,-x}\),也就是我们维护 “+x”、“-x” 相同的性质的东西就好了,即 \(c_i+d_i,c_i-d_i\)。转移是对称的。
复杂度 \(O(m^22^m)\),去掉一个 \(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\)。
解方程啦。
k-FWT
定义 k-OR 为每位取 max,k-AND 为每位取 min,k-XOR 为每位不进位加法。
OR:\(C_{x,i}C_{x,j}=C_{x,\max(i,j)}\),显然是一些前缀 1 和后缀 0。同样对应高维前缀和&高维前缀差分。
AND:前缀 0 和后缀 1,对应高维后缀和&高维后缀差分。
XOR:\(C_{x,i}C_{x,j}=C_{x,(i+j)\bmod k}\),显然可以带入单位根。然后可以给每个位置同时进行 \(a\) 次幂,也就是范德蒙德矩阵。
矩阵是 0-idx 的:\(C_{\operatorname{xor},i,j}=\omega_{k}^{ij},C^{-1}_{\operatorname{xor},i,j}=\frac{1}{k}\omega_{k}^{-ij}\)。
但是单位根不一定存在,考虑设 \(x\) 满足 \(x^k=1\),那么每个数就用多项式表示。
但是可能一个数的表示方式不唯一,考虑把 \(\bmod (x^k-1)\) 改成 \(\bmod \Phi_k(x)\)。
由于 \(\Phi_k(x)\mid x^k-1\),那么可以先 \(\bmod (x^k-1)\) 再 \(\bmod \Phi_k(x)\)。
分圆多项式 \(\Phi_k(x)\):因式分解 \(x^n-1=\prod_{i=1}^n (x-\omega_n^i)\)。
显然可以定义 \(\Phi_k(x)=\prod_{1\le i\le k,i\perp k} (x-\omega_k^i)\),有 \(x^n-1=\prod_{d|n} \Phi_d(x)\)。
- 性质 1:\(\Phi_k(x)\mid x^k-1\)。
- 性质 2:\(\Phi_k(x)\) 在有理数域 \(Q\) 上不可约。
- 根据恒等式递推。
- \(\Phi_n(x)=\prod_{d|n} (x^d-1)^{\mu(\frac{n}{d})}\):恒等式两边同时取 ln,然后根据莫比乌斯反演定义。
暴力可以做到 \(O(k^{n+2}n)\)。
CF1103E Radix sum
k-FWT 快速幂。
P5577 [CmdOI2019] 算力训练
复杂度约 \(O(6^{10})\),FWT 部分可以多一个 \(k/m\)。
类似 CF2096H 的套路维护 \(a\omega_k^{i}\) 的数量,最后卷积即可。
浙公网安备 33010602011771号