洛谷.4717.[模板]快速沃尔什变换(FWT)
https://www.mina.moe/archives/7598
//285ms 3.53MB
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define inv2 499122177
#define mod 998244353
#define Add(x,y) (x+y>=mod?x+y-mod:x+y)
#define Sub(x,y) (x<y?x-y+mod:x-y)
typedef long long LL;
const int N=(1<<17)+5;
int A[N],B[N],C[N],tA[N],tB[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void FWT_OR(int *a,int lim,int opt)
{
for(int i=2; i<=lim; i<<=1)
for(int j=0,mid=i>>1; j<lim; j+=i)
for(int k=j; k<j+mid; ++k)
if(opt==1) a[k+mid]=Add(a[k+mid],a[k]);
else a[k+mid]=Sub(a[k+mid],a[k]);
}
void FWT_AND(int *a,int lim,int opt)
{
for(int i=2; i<=lim; i<<=1)
for(int j=0,mid=i>>1; j<lim; j+=i)
for(int k=j; k<j+mid; ++k)
if(opt==1) a[k]=Add(a[k],a[k+mid]);
else a[k]=Sub(a[k],a[k+mid]);
}
void FWT_XOR(int *a,int lim,int opt)
{
for(int i=2; i<=lim; i<<=1)
for(int j=0,mid=i>>1; j<lim; j+=i)
for(int k=j,x,y; k<j+mid; ++k)
{
x=a[k], y=a[k+mid];
a[k]=Add(x,y), a[k+mid]=Sub(x,y);
if(opt==-1) a[k]=1ll*a[k]*inv2%mod, a[k+mid]=1ll*a[k+mid]*inv2%mod;
}
}
int main()
{
int n=1<<read();
for(int i=0; i<n; ++i) tA[i]=read();
for(int i=0; i<n; ++i) tB[i]=read();
memcpy(A,tA,sizeof A), memcpy(B,tB,sizeof B);
FWT_OR(A,n,1), FWT_OR(B,n,1);
for(int i=0; i<n; ++i) C[i]=1ll*A[i]*B[i]%mod;
FWT_OR(C,n,-1);
for(int i=0; i<n; ++i) printf("%d ",C[i]);
putchar('\n'); //FWT_OR(A,n,-1), FWT_OR(B,n,-1);
memcpy(A,tA,sizeof A), memcpy(B,tB,sizeof B);
FWT_AND(A,n,1), FWT_AND(B,n,1);
for(int i=0; i<n; ++i) C[i]=1ll*A[i]*B[i]%mod;
FWT_AND(C,n,-1);
for(int i=0; i<n; ++i) printf("%d ",C[i]);
putchar('\n');
memcpy(A,tA,sizeof A), memcpy(B,tB,sizeof B);
FWT_XOR(A,n,1), FWT_XOR(B,n,1);
for(int i=0; i<n; ++i) C[i]=1ll*A[i]*B[i]%mod;
FWT_XOR(C,n,-1);
for(int i=0; i<n; ++i) printf("%d ",C[i]);
putchar('\n');
return 0;
}
洛谷.4717.[模板]快速沃尔什变换(FWT)的更多相关文章
- 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记
一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 快速沃尔什变换FWT
快速沃尔什变换\(FWT\) 是一种可以快速完成集合卷积的算法. 什么是集合卷积啊? 集合卷积就是在集合运算下的卷积.比如一般而言我们算的卷积都是\(C_i=\sum_{j+k=i}A_j*B_k\) ...
- 集合并卷积的三种求法(分治乘法,快速莫比乌斯变换(FMT),快速沃尔什变换(FWT))
也许更好的阅读体验 本文主要内容是对武汉市第二中学吕凯风同学的论文<集合幂级数的性质与应用及其快速算法>的理解 定义 集合幂级数 为了更方便的研究集合的卷积,引入集合幂级数的概念 集合幂级 ...
- 【学习笔鸡】快速沃尔什变换FWT
[学习笔鸡]快速沃尔什变换FWT OR的FWT 快速解决: \[ C[i]=\sum_{j|k=i} A[j]B[k] \] FWT使得我们 \[ FWT(C)=FWT(A)*FWT(B) \] 其中 ...
- 关于快速沃尔什变换(FWT)的一点学习和思考
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
随机推荐
- MHL技术剖析,比HDMI更强【转】
转自:http://blog.chinaunix.net/uid-22030783-id-3294750.html MHL这个只是经常听说,没有见过的东西,现在已经非常火热了,我们才刚刚开始做,人家三 ...
- ubuntu 删除自带软件的方法
$ sudo dpkg -l | grep -i "need2del" $ sudo dpkg -P 或者: $ sudo apt-get --purge remove need2 ...
- mysql授权报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
授权用户时报错,ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 原因为其实与val ...
- xpath路径前可用方法测试
$x("string-length(//h3[@class='t'])") 8 $x("string(//h3[@class='t'])") "XPa ...
- WebSphere的jython编码的一个坑
was5.1版本,用"name=" in line这类判断字符串包含的方式时,系统会提示报错 TypeError: string member test needs char le ...
- 【bzoj1901】dynamic ranking(带修改主席树)
传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改 ...
- 安装ClamAV对centos系统进行病毒查杀
安装ClamAV 1.安装epel源 yum install epel-release 在安装了EPEL源后,运行下面的命令安装ClamAV # yum install clamav-server c ...
- 重装windows系统后配置Anaconda
给电脑换了系统,十分担心anaconda需要重装.还好以下方法完美解决.(同是win10 64位) 原始anaconda安装路径:D:\ProgramData\Anaconda3 (不能有空格哦) ...
- Windows服务项目打包成安装包(Windows服务)-----------VS2017项目程序打包成.msi或者.exe
VS2017项目程序打包成.msi或者.exe Windows服务项目使用VS2017项目程序打包成.msi或者.exe安装包 项目打包成安装包(Windows服务) 1.安装打包插件:Microso ...
- IntelliJ IDEA2017 使用教程
一:安装教程 请参考<Windows7下安装与破解IntelliJ IDEA2017> 二:目录说明 三:开发界面