FWT快速沃尔什变换
前言
学多项式怎么能错过\(FWT\)呢,然而这真是个毒瘤的东西,蒟蒻就只会背公式了\(\%>\_<\%\)
或卷积
tf(A) = (tf(A_0), tf(A_1) + tf(A_0))\\
utf(A) = (utf(A), utf(A_1) - utf(A_0))\\
\end{aligned}\]
与卷积
tf(A) = (tf(A_0) + tf(A_1), tf(A_1))\\
utf(A) = (utf(A_0) - utf(A_1), utf(A_1))\\
\end{aligned}\]
异或卷积
tf(A) = (tf(A_0) + tf(A_1), tf(A_0) - tf(A_1))\\
utf(A) = (\frac{utf(A_0) + utf(A_1)}{2}, \frac{utf(A_0) - utf(A_1)}{2})\\
\end{aligned}\]
Code
习惯写递归的非递归本来也不会
#include<bits/stdc++.h>
typedef int LL;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}
return x*f;
}
const LL mod=998244353,maxn=1<<18,inv2=499122177;
inline LL Pow(LL base,LL b){
LL ret(1);
while(b){
if(b&1) ret=1ll*ret*base%mod; base=1ll*base*base%mod; b>>=1;
}
return ret;
}
void Solve_or(LL n,LL *a,LL *b,LL *c){
n>>=1;
if(!n){
c[0]=1ll*a[0]*b[0]%mod;
return;
}
for(LL i=0;i<n;++i){
a[i+n]=1ll*(a[i+n]+a[i])%mod; b[i+n]=1ll*(b[i+n]+b[i])%mod;
}
Solve_or(n,a,b,c); Solve_or(n,a+n,b+n,c+n);
for(LL i=0;i<n;++i) c[i+n]=(c[i+n]-c[i]+mod)%mod;
}
void Solve_and(LL n,LL *a,LL *b,LL *c){
n>>=1;
if(!n){
c[0]=1ll*a[0]*b[0]%mod;
return;
}
for(LL i=0;i<n;++i){
a[i]=1ll*(a[i]+a[i+n])%mod; b[i]=1ll*(b[i]+b[i+n])%mod;
}
Solve_and(n,a,b,c); Solve_and(n,a+n,b+n,c+n);
for(LL i=0;i<n;++i) c[i]=1ll*(c[i]-c[i+n]+mod)%mod;
}
void Solve_xor(LL n,LL *a,LL *b,LL *c){
n>>=1;
if(!n){
c[0]=1ll*a[0]*b[0]%mod;
return;
}
for(LL i=0;i<n;++i){
std::tie(a[i],a[i+n])=std::make_tuple(a[i]+a[i+n],a[i]-a[i+n]+mod);
std::tie(b[i],b[i+n])=std::make_tuple(b[i]+b[i+n],b[i]-b[i+n]+mod);
a[i]%=mod; a[i+n]%=mod; b[i]%=mod; b[i+n]%=mod;
}
Solve_xor(n,a,b,c); Solve_xor(n,a+n,b+n,c+n);
for(LL i=0;i<n;++i){
std::tie(c[i],c[i+n])=std::make_tuple(c[i]+c[i+n],c[i]-c[i+n]+mod);
c[i]=1ll*c[i]%mod*inv2%mod; c[i+n]=1ll*c[i+n]%mod*inv2%mod;
}
}
LL n,N;
LL a[maxn],b[maxn],c[maxn],d[maxn],e[maxn],f[maxn],x[maxn],y[maxn],z[maxn];
int main(){
n=Read();
N=1<<n;
for(LL i=0;i<N;++i) a[i]=c[i]=e[i]=Read();
for(LL i=0;i<N;++i) b[i]=d[i]=f[i]=Read();
Solve_or(N,a,b,x);
Solve_and(N,c,d,y);
Solve_xor(N,e,f,z);
for(LL i=0;i<N;++i) printf("%d ",x[i]);printf("\n");
for(LL i=0;i<N;++i) printf("%d ",y[i]);printf("\n");
for(LL i=0;i<N;++i) printf("%d ",z[i]);printf("\n");
return 0;
}
FWT快速沃尔什变换的更多相关文章
- 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(快速沃尔什变换)
其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...
- 知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)
知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j ...
- 初学FWT(快速沃尔什变换) 一点心得
FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi=j⊕k=i∑Aj∗Bk此处乘号为普通乘法 ...
- FWT快速沃尔什变换例题
模板题 传送门 #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #de ...
- FWT快速沃尔什变换——基于朴素数学原理的卷积算法
这是我的第一篇学习笔记,如有差错,请海涵... 目录 引子 卷积形式 算法流程 OR卷积 AND卷积 XOR卷积 模板 引子 首先,考虑这是兔子 数一数,会发现你有一只兔子,现在,我再给你一只兔子 再 ...
- 关于快速沃尔什变换(FWT)的一点学习和思考
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...
- 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...
随机推荐
- Android 切换主题 (二)
Android 切换主题 (二) 背景 我原来写过一篇文章关于 android 切换主题的文章 -- Android 切换主题以及换肤的实现 , 里面介绍了如何使用 setTheme() 来切换主题, ...
- poj_1836 动态规划
题目大意 N个士兵排成一排,不是按照高度顺序排列.现在想要从中去掉几名士兵,从而使得队伍中剩余的士兵能够看到这排最左边或者最右边的那个士兵,某士兵能够看到最左边(或最右边)的士兵指这名士兵和最左边(或 ...
- [SCOI2010]传送带[三分]
//point(AB)->point(CD) 距离满足下凸性,用三分套三分实现 #include<cmath> #include<cstdio> #include< ...
- 【BZOJ2095】[Poi2010]Bridges 动态加边网络流
[BZOJ2095][Poi2010]Bridges Description YYD为了减肥,他来到了瘦海,这是一个巨大的海,海中有n个小岛,小岛之间有m座桥连接,两个小岛之间不会有两座桥,并且从一个 ...
- Linux 磁盘管理的命令
Linux 磁盘管理 磁盘分区及挂载: 先查询系统的使用情况: 使用fdisk -l语句 查询结果: 进行磁盘的新建:***添加磁盘时系统必须处于关机状态** 在进行对系统磁盘的使用情况的查询 查 ...
- Tomcat----->软件密码学基础配置tomcat http连接器 https
公钥只能私钥解开,私钥只能公钥解开. 类似于别人给你一个盒子,你用他的盒子和自己盒子加密,他手中有他的钥匙和自己的钥匙,可以解开就既能证明是你发的也能相信内容. 每个数据有自己的数据指纹,数据指纹是由 ...
- hdu2254 奥运 矩阵的应用
hdu2254 奥运 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2254 题意:题目让我们求得是的可以得到的金牌数量,而和金牌数量=在t1到t2天( ...
- TabBar变透明
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES];
- How to Design a Good API and Why it Matters
前谷歌首席 Java 架构师谈如何设优秀的 API – 码农网 http://www.codeceo.com/article/google-java-good-api.html 2015-11-24 ...
- Whether to hide the cookie from JavaScript
w禁用js访问特定cookie. https://codeigniter.com/userguide3/helpers/cookie_helper.html $this->load->he ...