【模板/经典题型】FWT
FWT在三种位运算下都满足FWT(a×b)=FWT(a)*FWT(b)
其中or卷积和and卷积还可以通过FMT实现(本质上就是个高维前缀和)
#include<bits/stdc++.h>
#define N 1100000
#define eps 1e-7
#define inf 1e9+7
#define db double
#define ll long long
#define ldb long double
using namespace std;
inline int read()
{
char ch=0;
int x=0,flag=1;
while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*flag;
}
const ll mo=998244353;
int ksm(int x,int k)
{
int ans=1;
while(k)
{
if(k&1)ans=1ll*ans*x%mo;
k>>=1;x=1ll*x*x%mo;
}
return ans;
}
void fwt_or(int *f,int n,int flag)
{
for(int k=2,kk=1;k<=(1<<n);k<<=1,kk<<=1)
for(int i=0;i<(1<<n);i+=k)
for(int j=0;j<kk;j++)
f[i+j+kk]=(f[i+j+kk]+flag*f[i+j])%mo;
}
void fwt_and(int *f,int n,int flag)
{
for(int k=2,kk=1;k<=(1<<n);k<<=1,kk<<=1)
for(int i=0;i<(1<<n);i+=k)
for(int j=0;j<kk;j++)
f[i+j]=(f[i+j]+flag*f[i+j+kk])%mo;
}
void fwt_xor(int *f,int n,int flag)
{
for(int k=2,kk=1;k<=(1<<n);k<<=1,kk<<=1)
for(int i=0;i<(1<<n);i+=k)
for(int j=0;j<kk;j++)
{
int t=f[i+j+kk];
f[i+j+kk]=(f[i+j]-t+mo)%mo;
f[i+j]=(f[i+j]+t)%mo;
}
if(flag==-1)
{
int inv=ksm(1<<n,mo-2);
for(int i=0;i<(1<<n);i++)f[i]=1ll*f[i]*inv%mo;
}
}
int a[N],b[N];
void Or(int n)
{
fwt_or(a,n,+1);fwt_or(b,n,+1);
for(int i=0;i<(1<<n);i++)a[i]=1ll*a[i]*b[i]%mo;
fwt_or(a,n,-1);
}
void And(int n)
{
fwt_and(a,n,+1);fwt_and(b,n,+1);
for(int i=0;i<(1<<n);i++)a[i]=1ll*a[i]*b[i]%mo;
fwt_and(a,n,-1);
}
void Xor(int n)
{
fwt_xor(a,n,+1);fwt_xor(b,n,+1);
for(int i=0;i<(1<<n);i++)a[i]=1ll*a[i]*b[i]%mo;
fwt_xor(a,n,-1);
}
int A[N],B[N];
int main()
{
int n=read();
for(int i=0;i<(1<<n);i++)A[i]=read();
for(int i=0;i<(1<<n);i++)B[i]=read();
for(int i=0;i<(1<<n);i++)a[i]=A[i],b[i]=B[i];
Or(n);for(int i=0;i<(1<<n);i++)printf("%lld ",(a[i]%mo+mo)%mo);printf("\n");
for(int i=0;i<(1<<n);i++)a[i]=A[i],b[i]=B[i];
And(n);for(int i=0;i<(1<<n);i++)printf("%lld ",(a[i]%mo+mo)%mo);printf("\n");
for(int i=0;i<(1<<n);i++)a[i]=A[i],b[i]=B[i];
Xor(n);for(int i=0;i<(1<<n);i++)printf("%lld ",(a[i]%mo+mo)%mo);printf("\n");
return 0;
}
【模板/经典题型】FWT的更多相关文章
- 【模板/经典题型】树上第k大
直接对树dfs一发,对每个节点建出主席树. 查询的时候主席树上二分,四个参数x+y-lca(x,y)-fa[lca(x,y)]. 如果要求支持动态加边的话,只需要一个启发式合并即可,每次暴力重构主席树 ...
- 【模板/经典题型】min-max容斥
一定注意容斥的时候-1的系数多加了1. 然后一种很常见的min-max容斥的策略就是以每个元素的出现时间作为权值. 最后一个出现的时间即为max,也就等价于全集出现的时间.
- 【模板/经典题型】带有直线限制的NE Latice Path计数
平移一下,变成不能接触y=x+1. 注意下面的操作(重点) 做点p=(n,m)关于这条直线的对称点q=(m-1,n+1). ans=f(p)-f(q). 其中f(x)为从(0,0)到点x的方案数.
- 针对JS经典题型对全局变量及局部变量的理解浅谈
第一次写博,还蛮激动... 看到了三题经典题型,就我目前的认识对此题进行总结.如有错误,敬请指正 首先,我们先明确一下JS引擎的工作步骤: js引擎工作分为两步: 1.将这个js中的变量和函数声明保存 ...
- Java数据结构和算法(三):常用排序算法与经典题型
常用的八种排序算法 1.直接插入排序 我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中.将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列.对第四个 ...
- 洛谷.4717.[模板]快速沃尔什变换(FWT)
题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...
- POJ:1094-Sorting It All Out(拓扑排序经典题型)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Description An ascending sorted sequence ...
- poj 3685 Matrix 二分套二分 经典题型
Matrix Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 5724 Accepted: 1606 Descriptio ...
- Javascript小白经典题型(一)
1. 输出是什么? function sayHi() { console.log(name) console.log(age) var name = 'Lydia' let age = 21 } sa ...
随机推荐
- tp框架中的一些疑点知识-1
tp默认的编码是utf-8 Runtime中的Cache和Logs都是分模块的,因为在应用app下可以有多个模块,但是 公共模块和Runtime模块只有一个, 所以, Runtime要包含各个模块的内 ...
- 洛谷luogu2782
P2782 友好城市 题目描述 有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市.北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同.每对友好城市都向政府申 ...
- 逆波兰表达式|2013年蓝桥杯A组题解析第六题-fishers
逆波兰表达式 正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便. 例如:3 + 5 * (2 + 6) - 1 而且,常常需要用括号来改变运算次序. 相反,如果使用逆波兰表 ...
- 案例2:用一条SQL查询出数学语文成绩都大于80分的学生姓名?
方法1: 查出科目成绩有小于80分的学生姓名,再约束并去重学生不等于查出来的姓名 select distinct A.name from t_score A where A.name not in(s ...
- win10 右键菜单很慢的解决方式
本来想用 win7 的,不想花很多时间折腾了.现在新电脑主板硬盘CPU都在排挤 win7 ,真是可怜呀.正题: 新电脑的性能应该还算不错的, 18 年跑分 29w 以上,但在图标上面右键却都要转圈几秒 ...
- python学习 day06打卡
今天学习的主要内容是: 一,小数据池 代码块的概念 python程序是由代码块构成的,一个代码块的文本作为python程序执行的单元. 代码块:一个模块,一个函数,一个类,甚至每一个command命令 ...
- 突变注释工具SnpEff,Annovar,VEP,oncotator比较分析--转载
https://www.jianshu.com/p/6284f57664b9 目前对于variant进行注释的软件主要有4个: Annovar, SnpEff, VEP(variant Effect ...
- 【Python】【IO】
# [[IO]] # [文件读写] '''读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的.读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现 ...
- 服务器不能设置内容类型HTTP头信息后发送
昨天一个用户反映,导出excel失败,我测试了一下,数据量小没有问题,数据量稍微大就会出现这个问题.咨询度娘也没有找到合适的解决方法,突然想到系统中,其他模块有下载excel附件的功能,但是从没有出现 ...
- Kali Linux 更新源 操作完整版教程
一.查看kali系统的更新源地址文件 命令: vim /etc/apt/sources.list 上面这是kali官方的更新源: 拓展知识: 一个完整的源包括:deb 和 deb-src:上图源地址是 ...