FWT应用

我不知道\(FWT\)的严格定义

百度百科和维基都不知道给一坨什么**东西

FWT(Fast Walsh Fransform),中文名快速沃尔什变换

然后我也不知道\(FWT\)到底是什么

你们怎么念FWT的反正我念扶卧塔

\(FFT\)当然可以做多项式卷积

形如\(C(k)=\sum_{i+j=k}f[i]g[j]\),很简单,大家都会

由于有这个性质所以也可做分治\(FFT\)

但是如果把\(i+j\)换一下操作符

变成\(C(k)=\sum_{i???j=k}f[i]g[j]\)

其中\(???\)可以是\(or,and,xor\)三种运算

这时就要用\(FWT\)来做特殊卷积了


结论

类似\(FFT\),把当前多项式\(A\)拆成前一半\(A_0\)和后一半\(A_1\)

注意不是奇数项和偶数项,只是前一半和后一半……(狗头保命)

也可知\(FWT\)也只能处理长度为\(2\)的次幂的多项式

or

\[FWT(A)=merge(FWT(A_0),FWT(A_0)+FWT(A_1))
\]

\[IFWT(A)=merge(IFWT(A_0),IFWT(A_0)-IFWT(A_1))
\]

and

\[FWT(A)=merge(FWT(A_0)+FWT(A_1),FWT(A_1))
\]

\[IFWT(A)=merge(IFWT(A_0)-IFWT(A_1),IFWT(A_1))
\]

xor

\[FWT(A)=merge(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1))
\]

\[IFWT(A)=merge({{IFWT(A_0)+IWFT(A_1)}\over 2},{IFWT(A_0)-IFWT(A_1)\over 2})
\]

\(+\)就是每一位值加起来,不知道\(merge\)是什么东西?

其实就是两个多项式前后拼起来……(狗头保命)

所以就算不清楚原理背下结论也很容易写出板子

由于某些原因原理完全可以跳过不看

但还是懂一下比较好


原理

清真のor&and

令\(FWT(A)=A',A'[i]=\sum_{i|j=i}A[j]\),\(B\)同理

\(i|j=i\)就表示二进制下\(j\)一定是\(i\)的子集

这样好像可以满足\(C'[i]=A'[i]*B'[i]\),不懂可以写一写

大概就是\(A'[i]\)已经包含下标或起来\(=i\)的\(A\),\(B'[i]\)也是

所以\(A'[i],B'[i]\)里包含的每个数下标或起来都等于\(i\)

自然两个和乘起来就是两两配对的总和,即\(C'[i]=A'[i]*B'[i]\)

肯定不能枚举\(i\)的二进制子集因为太沙雕

然后试着把\(A\)拆成前半段\(A_0\)和后半段\(A_1\)

如果知道\(FWT(A_0),FWT(A_1)\),可以知道\(FWT(A)\)吗

是个学过FFT的人都知道应该可以

设当前多项式\(A\)的长度为\(2^k\),\(A_0,A_1\)长度为\(2^{k-1}\)

\(FWT(A)\)的前半段表示\(A\)的二进制位第\(k\)位填\(0\)

那么是它子集的好像有\(FWT(A_0)\)

\(FWT(A)\)的前半段表示\(A\)的二进制位第\(k\)位填\(1\)

是它子集的不仅有\(FWT(A_1)\),还有\(FWT(A_0)\)

大概就是这个亚子其实我也不是很清楚

所以\(FWT(A)\)前半段就是\(FWT(A_0)\),后半段就是\(FWT(A_0),FWT(A_1)\)加起来

于是就有了结论的\(FWT(A)=merge(FWT(A_0),FWT(A_0)+FWT(A_1))\)

至于\(IFWT\),就是已知\(A_0',A_1'\),求\(A_0,A_1\)

由于\(A_0'=A_0,A_1'=A_0+A_1\),所以\(A_0=A_0',A_1=A_1'-A_0'\)

这样就有了两个简单易懂易背的结论

对于\(and\)也可同理推一波操作,和\(or\)很像,结论、代码也很像

打对\(or\)就可以打对\(and\).jpg

鬼畜のxor

一看\(or\)和\(and\)的结论就很清真,其实是因为\(or\)和\(and\)很像

\(xor\)奇怪就奇怪在运算和\(or,and\)有很大区别

但\(xor\)卷积还是有优化的方法

令\(i\&j\)中\(1\)数量的奇偶性为\(i\)与\(j\)的奇偶性,那么\(i\)与\(k\)的奇偶性异或\(j\)和\(k\)的奇偶性等于\(i⊕j\)和\(k\)的奇偶性

设\(f(x)\)表示\(x\)在二进制下\(1\)的个数

\[A'[i]=\sum_{f(i\&j)mod2=0}A[j]-\sum_{f(i\&j)mod2=1}A[j]
\]

如果这样的话

\[FWT(A)=merge(FWT(A_1)-FWT(A_0),FWT(A_1)+FWT(A_0))
\]

\[IFWT(A)=merge({{IFWT(A_1)-IWFT(A_0)}\over 2},{IFWT(A_1)+IFWT(A_0)\over 2})
\]

对于\(or\),由于\(or,and\)同理,令

\[A'[i]=\sum_{f(i|j)mod2=0}A[j]-\sum_{f(i|j)mod2=1}A[j]
\]

结果和上面的是一样的

于是由这两种运算的优美性质自然而然的可以得到xor的规律

于是你就知道为什么xor那么鬼畜


FWT板子

#define mod 998244353
#define inv2 499122177
inline void fwt_or(ll f[],ll len,ll inv)
{
for (ll i=1;i<len;i<<=1)
for (ll j=0;j<len;j+=(i<<1))
for (ll k=0;k<i;++k)
f[i+j+k]=(inv*f[j+k]+f[i+j+k]+mod)%mod;
}
inline void fwt_and(ll f[],ll len,ll inv)
{
for (ll i=1;i<len;i<<=1)
for (ll j=0;j<len;j+=(i<<1))
for (ll k=0;k<i;++k)
f[j+k]=(f[j+k]+inv*f[i+j+k]+mod)%mod;
}
inline void fwt_xor(ll f[],ll len,ll inv)
{
for (ll i=1;i<len;i<<=1)
for (ll j=0;j<len;j+=(i<<1))
for (ll k=0;k<i;++k)
{
ll x=f[j+k],y=f[i+j+k];
f[j+k]=(x+y)%mod,f[i+j+k]=(x-y+mod)%mod;
if (inv==-1)(f[j+k]*=inv2)%=mod,(f[i+j+k]*=inv2)%=mod;
}
}

FWT搞完

本人版权意识薄弱……

别人早就会的东西我现在才学

\(FFT\)都会了一年了我才懂\(FWT\)

原因还是我太蔡了

能轻松背板子的FWT(快速沃尔什变换)的更多相关文章

  1. FWT快速沃尔什变换学习笔记

    FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...

  2. [学习笔记]FWT——快速沃尔什变换

    解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...

  3. 浅谈算法——FWT(快速沃尔什变换)

    其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...

  4. 知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)

    知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j ...

  5. 初学FWT(快速沃尔什变换) 一点心得

    FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi​=j⊕k=i∑​Aj​∗Bk​此处乘号为普通乘法 ...

  6. FWT快速沃尔什变换

    前言 学多项式怎么能错过\(FWT\)呢,然而这真是个毒瘤的东西,蒟蒻就只会背公式了\(\%>\_<\%\) 或卷积 \[\begin{aligned}\\ tf(A) = (tf(A_0 ...

  7. FWT快速沃尔什变换例题

    模板题 传送门 #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #de ...

  8. FWT快速沃尔什变换——基于朴素数学原理的卷积算法

    这是我的第一篇学习笔记,如有差错,请海涵... 目录 引子 卷积形式 算法流程 OR卷积 AND卷积 XOR卷积 模板 引子 首先,考虑这是兔子 数一数,会发现你有一只兔子,现在,我再给你一只兔子 再 ...

  9. 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记

    一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...

随机推荐

  1. C# WinfForm 控件之dev报表 XtraReport (二) 固定数据绑定

    已经子解了XtraReport的初步用法 现在再进一步了解 数据绑定 我们还是先不整高深的 先来个写死的 让我们的数据库数据可以通过报表呈现先 1.准备 还在上节基础上 只不过我把form1 中的Do ...

  2. 2018年初面试Java(1.5年经验)

    xml文档如何解析 控制反转如何实现 http://www.cnblogs.com/qf123/p/8602972.html struts2和springmvc的区别 http://www.cnblo ...

  3. dubbo源码学习(二) : spring 自定义标签

    做dubbo的配置时很容易发现,dubbo有一套自己的标签,提供给开发者配置,其实每一个标签对应着一个 实体,在容器启动的时候,dubbo会对所有的配置进行解析然后将解析后的内容设置到实体里,最终du ...

  4. RHEL5/6/7中常用命令及命令之间的差异

    System basics Task RHEL5 RHEL6 RHEL7 View subscription information /etc/sysconfig/rhn/systemid /etc/ ...

  5. 解决在移动端上 click事件延迟300 毫秒的问题 fastclick.js

    1 为什么会发生延迟300毫秒的问题 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,才有了FastClick ...

  6. iptables开通某些端口

    #!/bin/bash #define all variance or parameter WAH_INT="eth0" WAH_INT_IP="222.222.101. ...

  7. lazyload懒加载和swiper轮播懒加载的用法

    对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度,比如商城网页. lazyload使用方法: 载入 JavaScript 文件: <script src="jquer ...

  8. delphi 特殊窗体

    delphi 窗体阴影 放窗体创建事件里面 SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or CS_DROPSHAD ...

  9. NX二次开发-UFUN获取对象的显示属性(图层,颜色,空白状态,线宽,字体,高亮状态)UF_OBJ_ask_display_properties

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> UF_initialize( ...

  10. NX二次开发-UFUN获取边的端点UF_MODL_ask_edge_verts

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> #include <uf ...