快速沃尔什变换

题目描述

给定长度为\(2^n\)两个序列\(A,B\),设\(C_i=\sum_{j\oplus k}A_jB_k\)分别当\(\oplus\)是or,and,xor时求出C

输入输出格式

输入格式:

第一行一个数n。 第二行\(2^n\)个数\(A_0..A_{2^n-1}\)第三行\(2^n\)个数\(B_0..B_{2^n-1}\)

输出格式:

三行每行\(2^n\)个数,分别代表\(\oplus\)是or,and,xor时\(C_0..C_{2^n-1}\)的值\(\bmod\ 998244353\)

输入输出样例

输入样例#1:

2

2 4 6 8

1 3 5 7

输出样例#1:

2 22 46 250

88 64 112 56

100 92 68 60

说明

\(n\le 17\)。

题解

2015吕凯风论文和2013王迪论文。

快速莫比乌斯变换

这个只能用来做集合并和与卷积,但是容易理解。



我通过《浅谈容斥原理》找到了另一种形式:

那么通过相同的手段,就可以做集合交卷积。

快速沃尔什变换

这个理论有点复杂,现场推是不可能的,所以背版子吧。

还有类似FFT的实现,不过我反而觉得难写许多。

代码总结

  • and是超集和变换(高维后缀和)。逆变换是超集差变换。

  • or是子集和变换(高维前缀和)。逆变换是子集差变换。

  • xor是蝴蝶变换。逆变换是最后除以长度。

void FAT(poly&a,int dir){ // and -> superset
int lim=a.size(),len=log2(lim);
for(int j=0;j<len;++j)
for(int i=0;i<lim;++i)if(~i>>j&1)
a[i]=add(a[i],dir==1?a[i|1<<j]:mod-a[i|1<<j]);
}
void FOT(poly&a,int dir){ // or -> subset
int lim=a.size(),len=log2(lim);
for(int j=0;j<len;++j)
for(int i=0;i<lim;++i)if(i>>j&1)
a[i]=add(a[i],dir==1?a[i^1<<j]:mod-a[i^1<<j]);
}
void FXT(poly&a,int dir){ // xor
int lim=a.size(),len=log2(lim);
for(int j=0;j<len;++j)
for(int i=0;i<lim;++i)if(~i>>j&1){
int l=a[i],r=a[i|1<<j];
a[i]=add(l,r),a[i|1<<j]=add(l,mod-r);
}
if(dir==-1){
int ilim=fpow(lim,mod-2);
for(int i=0;i<lim;++i) a[i]=mul(a[i],ilim);
}
} int main(){
int len=read<int>(),lim=1<<len;
poly f(lim),g(lim);
for(int i=0;i<lim;++i) read(f[i]);
for(int i=0;i<lim;++i) read(g[i]);
// or
poly a=f,b=g;
FOT(a,1),FOT(b,1);
for(int i=0;i<lim;++i) a[i]=mul(a[i],b[i]);
FOT(a,-1);
for(int i=0;i<lim;++i) printf("%d%c",a[i]," \n"[i==lim-1]);
// and
a=f,b=g;
FAT(a,1),FAT(b,1);
for(int i=0;i<lim;++i) a[i]=mul(a[i],b[i]);
FAT(a,-1);
for(int i=0;i<lim;++i) printf("%d%c",a[i]," \n"[i==lim-1]);
// xor
a=f,b=g;
FXT(a,1),FXT(b,1);
for(int i=0;i<lim;++i) a[i]=mul(a[i],b[i]);
FXT(a,-1);
for(int i=0;i<lim;++i) printf("%d%c",a[i]," \n"[i==lim-1]);
return 0;
}

LG4717 【模板】快速沃尔什变换的更多相关文章

  1. 洛谷.4717.[模板]快速沃尔什变换(FWT)

    题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...

  2. 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$ ...

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

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

  4. 快速沃尔什变换(FWT)学习笔记

    概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x)  即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^ ...

  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. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  7. 关于快速沃尔什变换(FWT)的一点学习和思考

    最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...

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

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

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

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

随机推荐

  1. Ubuntu vim java 自动补全javacomeplete2

    一 安装vundle $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 默认安装在/.v ...

  2. CCPC2018-湖南全国邀请赛 Solution

    A - Easy $h$-index 后缀扫一下 #include <bits/stdc++.h> using namespace std; #define ll long long #d ...

  3. hdu 5140 主席树

    这题说的是每个员工有工资 水平 在公司待的年限这几个属性,有大量的查询 查的是在一定的水平和工作年限的工人总工资是多少 这个思路是比较简单的我们按照他们的水平排序,排完后,使用主席树不断地往里面插,然 ...

  4. [one day one question] iphone6 plus h5页面滑动莫名卡

    问题描述: iphone6 plus h5页面滑动莫名卡,这怎么破? 解决方案: 比较奇葩的问题,在找不到任何问题的情况下,可以考虑在下发现的解决方案,html,body未添加height: 100% ...

  5. java 读CSV 和 Excel

    1.csv和excel读写对比 开发中经常遇到数据导入和导出功能,csv 和 excel是最常见的数据格式,本文比较了下csv和excel读写相同数据的效率: 测试数据格式一 用上面模板数据生成的测试 ...

  6. Linux内核分析08

    进程的切换和系统的一般执行过程 一,进程切换的关键代码switch_to分析 进程调度的时机 中断处理过程(包括时钟中断.I/O中断.系统调用和异常)中,直接调用schedule(),或者返回用户态时 ...

  7. 20145325张梓靖 实验四 "Andoid开发基础"

    20145325张梓靖 实验四 "Andoid开发基础" 实验内容 使用 Android Studio 设计"Hello" 设计过程 创建项目 选择.xml中的 ...

  8. LA 7278 Game of Cards(SG函数)

    https://vjudge.net/problem/UVALive-7278 题意: 两个人玩游戏,现在有n堆牌,轮到自己时,先在牌堆中选一堆牌,先在牌堆中选择拿走0~k张牌(至少得剩下一张),然后 ...

  9. Android下拉刷新控件--PullToRefresh的简单使用

    Android中很多时候都会用到上下拉刷新,这是一个很常用的功能,Android的v4包中也为我们提供了一种原生的下拉刷新控件--SwipeRefreshLayout,可以用它实现一个简洁的刷新效果, ...

  10. python stat获取文件信息

    import os statinfo = os.stat('qqq.txt') print(statinfo,"\n") print(statinfo.st_mode) 输出 os ...