做了一下(bestcoder#88)HDU 5909 ,发现是个树形dp。不小心写歪了就吃一个TLE。这个树形dp的复杂度是O(n*m^2),其实这个复杂度也能卡过吧。听说这里可以将O(m^2)优化成O(m*logm),这里就用到了FWT,快速沃尔什变换,然而我并不懂。所以这几天看了下 Fast Walsh-Hadamard Transform ,感觉挺有趣的(骗你的),根据一位远古神犇的博客写了一些。

具体为什么是对的我还没有完全理清,大概就是个奇葩的构造吧……

Fast Walsh-Hadamard Transform 就是用于解决一类卷积问题的方法。大概如下:

其中指任一二元逻辑位运算。

一些基础的想法:
为了加速这个运算,我们还是需要用一些类似FFT的东西。
注意到位运算都是有位独立性的,那么每次我们只考虑某一位?
不妨假设:

那么,我们的目标就是求出:

假如构造了一个变换 ,满足:

且可以在较短时间内进行变换及其逆变换,那么我们的目标就可以实现了。
似乎便不能继续往下走了,那我们具体情况具体分析。

XOR

指异或运算的时候,即 SRM518 Nim 那题中所需要的方法。
此时:

接下来怎么来找变换 ?其实我并不知道这个变换是怎么找到的(可能哪个无聊的正好构造出来了?或者从很小的情况中顺藤摸瓜出来了?)。
但是这个变换确实存在,且形式比较漂亮。

虽然不知道这个是怎么构造出来的,不过我们还是可以很轻易地验证的。

AND

指与运算的时候,也是可以做的。
变换为:

同样轻易可验证。

OR

指或运算的时候,可以类比于与运算的变换:

XNOR,NAND,NOR

指异或非运算、与非运算、或非运算时。
我们可以将 直接用异或运算、与运算、或运算的方法求出来,然后将互反的两位交换即可。

代码:
这里只贴一个与运算的代码,别的运算都可以类似实现。

void FWT( ll X[], int l, int r, int v ) {if ( l == r ) return;int m = ( l + r ) >> 1;FWT( X, l, m, v ); FWT( X, m + 1, r, v );FOR ( i, 0, m - l ) {X[ l + i ] += X[ m + 1 + i ] * v;}
}

模板:

void FWT(int a[],int n)
{  for(int d=1;d<n;d<<=1)  for(int m=d<<1,i=0;i<n;i+=m)  for(int j=0;j<d;j++)  {  int x=a[i+j],y=a[i+j+d];  a[i+j]=(x+y)%mod,a[i+j+d]=(x-y+mod)%mod;  //xor:a[i+j]=x+y,a[i+j+d]=(x-y+mod)%mod;  //and:a[i+j]=x+y;  //or:a[i+j+d]=x+y;  }
}  void UFWT(int a[],int n)
{  for(int d=1;d<n;d<<=1)  for(int m=d<<1,i=0;i<n;i+=m)  for(int j=0;j<d;j++)  {  int x=a[i+j],y=a[i+j+d];  a[i+j]=1LL*(x+y)*rev%mod,a[i+j+d]=(1LL*(x-y)*rev%mod+mod)%mod;  //xor:a[i+j]=(x+y)/2,a[i+j+d]=(x-y)/2;  //and:a[i+j]=x-y;  //or:a[i+j+d]=y-x;  }
}
void solve(int a[],int b[],int n)
{  FWT(a,n);  FWT(b,n);  for(int i=0;i<n;i++) a[i]=1LL*a[i]*b[i]%mod;  UFWT(a,n);
}  

Fast Walsh-Hadamard Transform (快速沃尔什变换)相关推荐

  1. Fast Walsh-Hadamard Transform——快速沃尔什变换

    模板题: 给定$n = 2^k$和两个序列$A_{0..n-1}$, $B_{0..n-1}$,求 $$C_i = \sum_{j \oplus k = i} A_j B_k$$ 其中$\oplus$ ...

  2. Fast Radial Symmetry Transform/快速径向对称变换

    本文主要介绍一下利用径向变换进行特征提取的方法和原理,基本原理主要来自Gareth Loy and Alexander Zelinsky的A Fast Radial Symmetry Transfor ...

  3. [模板] 快速沃尔什变换

    快速沃尔什变换 快速沃尔什变换是求这样的式子: 对序列 \(A\), \(B\), 求序列 \(C\), 使得 \[ C_{i}=\sum_{j \oplus k} A_{j} B_{k} \] 其中 ...

  4. FWT(快速沃尔什变换)零基础详解qaq(ACM/OI)

    1.前言(废话) 记得一年半之前做SRM518 Nim的时候还不知道FWT,当时自己用分治完美的水过去了.然后昨天的牛客有一道题,是说nim博弈中有n堆石子,请问最多取出多少堆石子可以让先手必败.当时 ...

  5. [多项式算法](Part 4)FWT 快速沃尔什变换 学习笔记

    其他多项式算法传送门: [多项式算法](Part 1)FFT 快速傅里叶变换 学习笔记 [多项式算法](Part 2)NTT 快速数论变换 学习笔记 [多项式算法](Part 3)MTT 任意模数FF ...

  6. SIFT和SURF的替换算法——ORB (Oriented FAST and Rotated BRIEF 快速定向和旋转)

    SIFT和SURF的替代算法--ORB (Oriented FAST and Rotated BRIEF 快速定向和旋转 1. 效果图 2. 源码 参考 1. 用于关键点检测和描述的SIFT(Scal ...

  7. 解题报告(一)快速沃尔什变换FWT(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. 《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 0x00 卷积 0x01 多项式 0x02 卷积的定义 0x03 卷积的基本性质 0x04 位运 ...

  9. 快速沃尔什变换(FWT)

    1前言 在之前学完了FFT稍微码了一些题.也学习了一下NTT相关的知识之后,我觉得有必要学习一下FWT,这篇博客就是阐述我对FWT的理解的 2介绍 2.1解决的问题 对于FFT,它的过程本质上是cn= ...

  10. 模板:快速莫比乌斯变换(FMT)+快速沃尔什变换(FWT)(多项式)

    文章目录 前言 解析 OR 定义 变换: 逆变换 代码 AND 代码 XOR 定义 变换 逆变换 代码 所谓快速沃尔什变换,就是快速的沃尔玛什锦专柜变换 (逃) 前言 正常卷积的定义:ck=∑i+j= ...

最新文章

  1. Nat. Commun. | 深度学习探索可编程RNA开关
  2. Deep Learning(深度学习)学习笔记整理系列之(五)
  3. Unable to execute dex: Multiple dex files define Lcom/kenai/jbosh/AbstractAttr
  4. 一次解决libgcc_s.so.1 must be installed for pthread_cancel to work的经历
  5. 实习二 分组密码加密_分组密码加密模式
  6. transition
  7. branch and bound(分支定界)算法-基础概念
  8. 矩形窗函数的频谱图_读书笔记6-单频矩形脉冲信号
  9. 《网络安全原理与实践》一1.12 复习题
  10. java源码编译_java 源码编译
  11. uiso9|uiso9_cn.exe
  12. 如何更新google chrome浏览器
  13. 【转载】公主和士兵的故事
  14. 无线传感网络——串口通信
  15. mysql .ibd_MySQL单表ibd文件恢复方法详解
  16. Keepalived配置报错Unicast peers are not supported in strict mode
  17. html5怎么导出表格,《网页 导出到 excel表格数据》 如何将网页表格导出到excel
  18. vscode配置vue代码模板
  19. java都市男人心痒痒_男人听了会“心痒痒”的四个称呼,低情商的女人从来没叫过...
  20. Kafka SASL/PLAIN 环境构建(Docker版)

热门文章

  1. 解决api打开显示“已取消到该网页的导航”问题或者api里面没有内容
  2. better-scroll滚动的同时样式透明度发生变化
  3. 仿bing搜索页面制作(大概)
  4. arm架构下spinlock原理 (代码解读)
  5. Python数据类型之三(列表)
  6. 诺基亚系列手机型号命名研究(转)
  7. 使用 Nginx 实现 URL 的重定向
  8. 什么是独立主机?独立主机的优势有些?
  9. 如何用Photoshop去制作一张质量高的banner(轮播图)?
  10. 烧写ARM板----MYS-6ULX