【模板/经典题型】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 ...
随机推荐
- LVM基本应用,扩展及缩减实现
一.基本概念 如上图所示:底层PV(物理卷可能是硬盘设备,分区或RAID等),一个或多个PV组织成一个VG(卷组),卷组是不能直接格式化使用的,所以在VG之上,还需要创建LV进行格式化使用.VG在逻辑 ...
- js插入排序
插入排序 平均时间复杂度O(n*n) 最差情况O(n*n) 最好情况O(n) 空间复杂度O(1) 稳定性:稳定 function insertSort (arr) { var len = arr.le ...
- C# 控件线程匿名委托定义
当你在子线程中要修改主线程某个控件的值时,有不想再去定义一个线程变量时,就可以直接使用线程匿名委托来实现. 主要是方便快捷 控件.BeginInvoke(new ThreadStart(delegat ...
- P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)
思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...
- 使用路由传参时,query与params的区别!
query 1:参数会在地址栏显示 2:参数不需要在路由的path后接:args1/:args2 3:获取参数用this.$route.query.args1 params 1:参数需要在路由的pat ...
- .Net Core之Swagger
1.项目生成xml 2.添加链接文件,并将属性设值为始终复制 3.添加swagger引用:Swashbuckle.AspNetCore 4.startup.cs配置swargger的xml来源: Co ...
- springmvc上传zip文件并解压缩代码示例
<input type="file" id="file" name="file"> spring中的配置: <!-- ...
- 测试驱动android
测试驱动android开发 在安卓模拟器或者真机上跑测试用例速度很慢.构建.部署.启动app,通常需要花费一分钟或者更久.这不是TDD(测试驱动开发)模式.Robolectric提供一种更好的方式. ...
- git pull 提示 There is no tracking information for the current branch
在执行git pull的时候,提示当前branch没有跟踪信息: git pull There is no tracking information for the current branch. P ...
- logback的使用
一.logback与log4j的比较(摘自他人博客): 1.更快的实现 Logback的内核重写了,在一些关键执行路径上性能提升10倍以上.而且logback不仅性能提升了,初始化内存加载也 ...