其实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(A)=\begin{cases}(FWT(A_0),FWT(A_0+A_1))&,n>0\\A&,n=0\end{cases}
\]

然后上面的部分是指两部分合到一块儿

然后再给个性质

\[FWT(A)_i=\sum\limits_{j\lor i=i}A_j
\]

所以说统计子集和啥的就直接FWT一下就好了,还有个叫FMT(快速莫比乌斯变换)的,其实就是这玩意


FWT——And卷积

同样将多项式\(A\)拆开,有

\[FWT(A)=\begin{cases}(FWT(A_0+A_1),FWT(A_1))&,n>0\\A&,n=0\end{cases}
\]

其实你发现和Or卷积差不多,咋记呢?你看\(A_0,A_1\)的差别就在最高位,然后Or(\(\lor\))肯定是答案贡献到1上去了,所以是后面加,然后And(\(\land\))就反过来,然后就这么记吧……

同样的,这个卷积也有个性质

\[FWT(A)_i=\sum\limits_{j\land i=i}A_j
\]

这就相当于统计超集和了……


FWT——Xor卷积

这个东西还是要记一下的……

\[FWT(A)=\begin{cases}(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1))&,n>0\\A&,n=0\end{cases}
\]

然后这个貌似没有那啥奇怪性质……


FWT讲完了,但是你不变换回来没啥用的啊……所以显然也要有IFWT

然后IFWT也比较简单

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

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

\[\oplus :IFWT(A)=(\dfrac{IFWT(A_0)+IFWT(A_1)}{2},\dfrac{IFWT(A_0)-IFWT(A_1)}{2})
\]


然后贴个板子好了……

  1. void div(int &x){x=1ll*x*inv%p;}
  2. void FWT_xor(int *a,int n,int type){
  3. for (int i=2;i<=n;i<<=1){
  4. for (int j=0;j<n;j+=i){
  5. for (int k=0;k<i>>1;k++){
  6. int x=a[j+k],y=a[j+k+(i>>1)];
  7. a[j+k]=(x+y)%p,a[j+k+(i>>1)]=(x-y+p)%p;
  8. if (!~type) div(a[j+k]),div(a[j+k+(i>>1)]);
  9. }
  10. }
  11. }
  12. }
  13. void FWT_and(int *a,int n,int type){
  14. for (int i=2;i<=n;i<<=1){
  15. for (int j=0;j<n;j+=i){
  16. for (int k=0;k<i>>1;k++){
  17. (a[j+k]+=type*a[j+k+(i>>1)])%=p;
  18. if (a[j+k]<0) a[j+k]+=p;
  19. }
  20. }
  21. }
  22. }
  23. void FWT_or(int *a,int n,int type){
  24. for (int i=2;i<=n;i<<=1){
  25. for (int j=0;j<n;j+=i){
  26. for (int k=0;k<i>>1;k++){
  27. (a[j+k+(i>>1)]+=type*a[j+k])%=p;
  28. if (a[j+k+(i>>1)]<0) a[j+k+(i>>1)]+=p;
  29. }
  30. }
  31. }
  32. }

浅谈算法——FWT(快速沃尔什变换)的更多相关文章

  1. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

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

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

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

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

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

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

  5. 浅谈FFT(快速傅里叶变换)

    前言 啊摸鱼真爽哈哈哈哈哈哈 这个假期努力多更几篇( 理解本算法需对一些< 常 用 >数学概念比较清楚,如复数.虚数.三角函数等(不会的自己查去(其实就是懒得写了(¬︿̫̿¬☆) 整理了一 ...

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

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

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

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

  8. 浅谈算法——线段树之Lazy标记

    一.前言 前面我们已经知道线段树能够进行单点修改和区间查询操作(基本线段树).那么如果需要修改的是一个区间该怎么办呢?如果是暴力修改到叶子节点,复杂度即为\(O(nlog n)\),显然是十分不优秀的 ...

  9. 浅谈算法——Manacher

    字符串算法在各大高级比赛中均有用到,所以,学习好字符串算法对我们而言十分重要.那么,今天我们就给大家介绍一个快速求回文串的算法,Manacher算法,我们也习惯性叫它马拉车算法. 一.引入 首先我们要 ...

随机推荐

  1. LeetCode(28)题解:Implement strStr()

    https://leetcode.com/problems/implement-strstr/ 题目: Implement strStr(). Returns the index of the fir ...

  2. VC 无边框对话框的任务栏右键菜单

    MFC ,基于对话框的程序,属性为:Border : none. 程序运行后,在任务栏里面点右键,不会弹出类似下面的菜单: 在对话框的OnInitDialog里面添加如下语句即可: ModifySty ...

  3. Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 排序,贪心

    C. Hacker, pack your bags!     It's well known that the best way to distract from something is to do ...

  4. 事件序列化器 Flume 的无数据丢失保证,Channel 和事务

    小结: 1.Flume 的持久性保证依赖于使用的持久性Channel 的保证 通过事件序列化器将Flume事件转化为外部存储格式 主要的事件序列化器: 1.文本 2.带有头信息的文本 3.Avro序列 ...

  5. JavaScript数组的某些操作(一)

    在软件开发的过程中JavaScript的编程在所难免.当中对数组的操作尤为常见,这里介绍一下和JavaScript数组相关的某些操作: 1.删除并返回数组的第一个元素--shift方法: <!D ...

  6. WJC上学记

    WJC上学记题目描述:WJC为了追求YHY,决定考上树人,但是,愚蠢的他没有足够好的成绩,只能靠自己的亲戚来帮忙.但是由于他足够愚蠢,连自己的亲戚都不认识,仁慈而被树人优录的Geek_du决定帮助他. ...

  7. python搭建httpserver

    因为手机要下载电脑上的文件,使用手机助手什么的经常出没反应,于是网上查了下,直接使用python搭建简单的HTTP服务器,之后在其运行目录下扔文件就行了.浏览器访问时可以直接显示相关的文件列表.参考了 ...

  8. GCD基础知识

    并行和并发 在英文世界里,「并行」和「并发」的区别比较清晰,「并行」对应parallelism,「并发」对应concurrency:但在中文世界里二者仅一字之差,两个概念非常容易弄混淆: 各种资料对「 ...

  9. Babel转码器

    Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行.这意味着,你可以用ES6的方法 编写程序,又不用担心现在环境是否支持.

  10. html marquee 标签(转)

    该标签不是HTML3.2的一部分,并且只支持MSIE3以后内核,所以如果你使用非IE内核浏览器(如:Netscape)可能无法看到下面一些很有意思的效果该标签是个容器标签语法: <marquee ...