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,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...
随机推荐
- Django学习笔记第十一篇--关于session
一.session和sessionid: sessionid是cookie的一个字段,sessionid一般如下: """请求报文""" & ...
- 【BZOJ1070】[SCOI2007]修车 费用流
[BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...
- 【BZOJ4872】[Shoi2017]分手是祝愿 数学+期望DP
[BZOJ4872][Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n ...
- iOS 按钮文字加划掉线
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(, , , )]; NSDictionary *normalTitleAttribu ...
- 01.ZooKeeper安装和介绍
1.ZooKeeper安装和启动 1.下载解压ZooKeeper ZooKeeper官方地址:http://zookeeper.apache.org/ 下载当前稳定版本:zookeeper-3.4.6 ...
- 170403、java 版cookie操作工具类
package com.rick.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; imp ...
- Efficient data transfer through zero copy
Efficient data transfer through zero copy https://www.ibm.com/developerworks/library/j-zerocopy/ Eff ...
- application/x-protobuf payload加密 知乎
- Bootstrap插件架构 基于元素自定义属性的布局规则
w HTML布局规则 Javascript实现步骤 插件调用方法
- postfix邮箱服务器修改附件大小限制遇到的问题与解决
Q1:邮件大小限制为30M,发送的附件大小为25M,发送后提示邮件大小超过限制 A:邮箱客户端在发送邮件时会把附件进行base64转码,转码之后邮件大小会超过附件+正文的大小,所以10M的附件在经过转 ...