浅谈算法——FWT(快速沃尔什变换)
其实FWT我啥都不会,反正就是记一波结论,记住就好……
具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记
现有一些卷积,形如
\(C_k=\sum\limits_{i\lor j=k}A_i*B_j\)
\(C_k=\sum\limits_{i\land j=k}A_i*B_j\)
\(C_k=\sum\limits_{i\oplus j=k}A_i*B_j\)
然后普通的FFT肯定应付不了这玩意,于是就有了FWT(快速沃尔什变换),然后我就直接写结论好了……
FWT——Or卷积
我们把多项式\(A\)(\(2^n\)项)拆成两部分\(A_0,A_1\),则有
\]
然后上面的部分是指两部分合到一块儿
然后再给个性质
\]
所以说统计子集和啥的就直接FWT一下就好了,还有个叫FMT(快速莫比乌斯变换)的,其实就是这玩意
FWT——And卷积
同样将多项式\(A\)拆开,有
\]
其实你发现和Or卷积差不多,咋记呢?你看\(A_0,A_1\)的差别就在最高位,然后Or(\(\lor\))肯定是答案贡献到1上去了,所以是后面加,然后And(\(\land\))就反过来,然后就这么记吧……
同样的,这个卷积也有个性质
\]
这就相当于统计超集和了……
FWT——Xor卷积
这个东西还是要记一下的……
\]
然后这个貌似没有那啥奇怪性质……
FWT讲完了,但是你不变换回来没啥用的啊……所以显然也要有IFWT
然后IFWT也比较简单
\]
\]
\]
然后贴个板子好了……
void div(int &x){x=1ll*x*inv%p;}
void FWT_xor(int *a,int n,int type){
for (int i=2;i<=n;i<<=1){
for (int j=0;j<n;j+=i){
for (int k=0;k<i>>1;k++){
int x=a[j+k],y=a[j+k+(i>>1)];
a[j+k]=(x+y)%p,a[j+k+(i>>1)]=(x-y+p)%p;
if (!~type) div(a[j+k]),div(a[j+k+(i>>1)]);
}
}
}
}
void FWT_and(int *a,int n,int type){
for (int i=2;i<=n;i<<=1){
for (int j=0;j<n;j+=i){
for (int k=0;k<i>>1;k++){
(a[j+k]+=type*a[j+k+(i>>1)])%=p;
if (a[j+k]<0) a[j+k]+=p;
}
}
}
}
void FWT_or(int *a,int n,int type){
for (int i=2;i<=n;i<<=1){
for (int j=0;j<n;j+=i){
for (int k=0;k<i>>1;k++){
(a[j+k+(i>>1)]+=type*a[j+k])%=p;
if (a[j+k+(i>>1)]<0) a[j+k+(i>>1)]+=p;
}
}
}
}
浅谈算法——FWT(快速沃尔什变换)的更多相关文章
- 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树
http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...
- FWT快速沃尔什变换学习笔记
FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...
- [学习笔记]FWT——快速沃尔什变换
解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...
- 知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)
知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j ...
- 浅谈FFT(快速傅里叶变换)
前言 啊摸鱼真爽哈哈哈哈哈哈 这个假期努力多更几篇( 理解本算法需对一些< 常 用 >数学概念比较清楚,如复数.虚数.三角函数等(不会的自己查去(其实就是懒得写了(¬︿̫̿¬☆) 整理了一 ...
- 初学FWT(快速沃尔什变换) 一点心得
FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi=j⊕k=i∑Aj∗Bk此处乘号为普通乘法 ...
- FWT快速沃尔什变换——基于朴素数学原理的卷积算法
这是我的第一篇学习笔记,如有差错,请海涵... 目录 引子 卷积形式 算法流程 OR卷积 AND卷积 XOR卷积 模板 引子 首先,考虑这是兔子 数一数,会发现你有一只兔子,现在,我再给你一只兔子 再 ...
- 浅谈算法——线段树之Lazy标记
一.前言 前面我们已经知道线段树能够进行单点修改和区间查询操作(基本线段树).那么如果需要修改的是一个区间该怎么办呢?如果是暴力修改到叶子节点,复杂度即为\(O(nlog n)\),显然是十分不优秀的 ...
- 浅谈算法——Manacher
字符串算法在各大高级比赛中均有用到,所以,学习好字符串算法对我们而言十分重要.那么,今天我们就给大家介绍一个快速求回文串的算法,Manacher算法,我们也习惯性叫它马拉车算法. 一.引入 首先我们要 ...
随机推荐
- 4. 基本TCP套接字编程
基本函数接口 socket函数 #include <sys/socket.h> int socket(int family, int type, int protocol); 成功时返回一 ...
- windows下在eclipse上远程连接hadoop集群调试mapreduce错误记录
第一次跑mapreduce,记录遇到的几个问题,hadoop集群是CDH版本的,但我windows本地的jar包是直接用hadoop2.6.0的版本,并没有特意找CDH版本的 1.Exception ...
- EasyUI+Python-flask实现CRUD应用
1.需求分析 需求:应用easyui制作前端表格数据显示,flask制作后端路由 环境搭建略 2.easyui前端实现 2.1 easyui是前端实用的一个框架,这里我们要实现的是easyui的CRU ...
- linux内核的三种主要调度策略
linux内核的三种主要调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务 3,SCHED_RR实时调度策略,时间片轮转 实时进程将得到优先调用, ...
- 3种方法判断手机浏览器跳转WAP手机网站
随着移动设备的普及,企业的网络宣传已经不能局限在PC端,而需要同时在移动端有所建树.对于公司网站来说,以前都是做的PC端的,当然手机等移动端也可以访问,但是用户体验肯定不如完全适合的手机端来的方便.我 ...
- SpringBoot快速HelloWorld入门
1.新建maven项目 2.pom.xml 里添加SpringBoot所依赖的jar包 <parent> <groupId>org.springframework.boot&l ...
- OpenCV——PS滤镜算法之 Ellipsoid (凹陷)
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- Objective-C Runtime(二)消息传递机制
在对象上调用方法是包括Objective-C的众多语言都具备的功能.但在Objective-C中,这个术语叫『传递消息』(pass a message).『消息』有「名称」(name)或「选择子」(s ...
- 【HNOI 2002】 营业额统计
[题目链接] 点击打开链接 [算法] 观察式子 : 最小波动值 = min{|该天营业额 - 之前某天的营业额|} = min{该天营业额 - 该天营业额的前驱,该天营业额的后继 - 该天营业额} 用 ...
- 【前端】Element-UI 省市县级联选择器 JSON数据
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/element_cascader.html 不想自己处理的就直接下载吧 http://shamoyuu.bj.bce ...