FWT——快速沃尔什变换
来源:互联网 发布:mac怎么安装输入法 编辑:程序博客网 时间:2024/06/08 11:31
前言
这个东西就是方便做题···也没什么大用处,写起来倒是比FFT简单不少,原理也很简单。
问题描述
我们知道,在FFT中,我们快速解决了
我们现在需要快速解决一类位运算卷积问题。即,
FWT
我们记
为了快速解决
transfer
就以异或举例。和FFT一样的,为了快速算,必须补齐到2的幂次的大小。
令
则
其中
即把A中的下标按照二进制最高位为0或1分成前后两部分(前面的为A0,后面的为A1),分治下去做。
分治之后得到
其实这个过程就相当于是一个精妙的构造,使得原问题转化了。
至于这样为什么是对的,证明起来很麻烦,思路大概是:我们随便搞个A,B,C,然后按照原意义给出
这样就弄完了transfer
untransfer
得到了tf(C),我们再把它逆转换回来就好了。证明方法是一样的。
代码
十分简短,由于我只是去简单应用它,大概知道步骤,背下代码就行了,实现过程应该跟FFT有异曲同工之妙(划掉O(∩_∩)O
(我自己还没打,临时搬个别人的代码)
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); }
- FWT——快速沃尔什变换
- 快速沃尔什变换FWT
- [FWT] 快速沃尔什变换学习笔记
- 快速沃尔什变换(FWT) 学习笔记
- 快速沃尔什变换详解(FWT)
- 文章标题 FWT (快速沃尔什变换) 模板
- Codeforces 662C Binary Table 快速沃尔什变换(FWT)
- Codeforces 662C Binary Table FWT 快速沃尔什变换
- 快速沃尔什变换(FWT)讲解 解决集合卷积的方法
- CSU 1911 Card Game 快速沃尔什变换(FWT)模板题
- 快速沃尔什变换(FWT)讲解 解决集合卷积的方法
- 快速沃尔什变化(FWT)介绍
- FWT——学习笔记
- FFT NTT FWT: 傅立叶变换, 求卷积
- FWT
- FWT
- 快速沃尔什变换
- 新知——快速数论变换
- 数据库_SQL高级查询
- CHROME开发者工具的小技巧
- 中国电信ChinaNet骨干网大区片区和省级节点
- 装饰者模式 VS 建造者模式
- mybatis之动态代理
- FWT——快速沃尔什变换
- 基本类型和引用类型的区别
- css cursor鼠标指针光标样式
- 算法分析与设计课程18——《算法概论》8.19
- 成绩单
- hdu- 1058 Humble Numbers
- 使用决策树算法预测森林植被
- 逆置单链表以及求链表倒数第k个结点——题集(二)
- STC89C52MCU--软件实现系统复位