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的更多相关文章

  1. 【模板/经典题型】树上第k大

    直接对树dfs一发,对每个节点建出主席树. 查询的时候主席树上二分,四个参数x+y-lca(x,y)-fa[lca(x,y)]. 如果要求支持动态加边的话,只需要一个启发式合并即可,每次暴力重构主席树 ...

  2. 【模板/经典题型】min-max容斥

    一定注意容斥的时候-1的系数多加了1. 然后一种很常见的min-max容斥的策略就是以每个元素的出现时间作为权值. 最后一个出现的时间即为max,也就等价于全集出现的时间.

  3. 【模板/经典题型】带有直线限制的NE Latice Path计数

    平移一下,变成不能接触y=x+1. 注意下面的操作(重点) 做点p=(n,m)关于这条直线的对称点q=(m-1,n+1). ans=f(p)-f(q). 其中f(x)为从(0,0)到点x的方案数.

  4. 针对JS经典题型对全局变量及局部变量的理解浅谈

    第一次写博,还蛮激动... 看到了三题经典题型,就我目前的认识对此题进行总结.如有错误,敬请指正 首先,我们先明确一下JS引擎的工作步骤: js引擎工作分为两步: 1.将这个js中的变量和函数声明保存 ...

  5. Java数据结构和算法(三):常用排序算法与经典题型

    常用的八种排序算法 1.直接插入排序 我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中.将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列.对第四个 ...

  6. 洛谷.4717.[模板]快速沃尔什变换(FWT)

    题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...

  7. POJ:1094-Sorting It All Out(拓扑排序经典题型)

    Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Description An ascending sorted sequence ...

  8. poj 3685 Matrix 二分套二分 经典题型

    Matrix Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 5724   Accepted: 1606 Descriptio ...

  9. Javascript小白经典题型(一)

    1. 输出是什么? function sayHi() { console.log(name) console.log(age) var name = 'Lydia' let age = 21 } sa ...

随机推荐

  1. 【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理

    一 自定义表结构 这里还是用的mysql数据库,所以pom.xml文件都不用修改.这里只要新建三张表即可,user表.role表.user_role表.其中user用户表,role角色表为保存用户权限 ...

  2. 题解——洛谷P1550 [USACO08OCT]打井Watering Hole(最小生成树,建图)

    题面 题目背景 John的农场缺水了!!! 题目描述 Farmer John has decided to bring water to his N (1 <= N <= 300) pas ...

  3. (zhuan) How to Train Neural Networks With Backpropagation

    this blog from: http://blog.demofox.org/2017/03/09/how-to-train-neural-networks-with-backpropagation ...

  4. JS计算前一天或后一天,前一月后一月

    JS计算前一天或后一天,前一月后一月,上一天下一下,上一月下一月. 方法一: function ktkGetNextMonth(currentDate, scaleStep) { //scaleSte ...

  5. 一、python (int & str 的方法)

    1.变量:命名与使用 #!/usr/bin/env/ python # -*- coding:utf-8 -*- name = 'liQM' 只能包含字母.数字或下划线: 第一个字符不能是数字: 简短 ...

  6. 用户管理--借鉴技术大牛ken

    本节内容 useradd userdel usermod groupadd groupdel 用户管理 为什么需要有用户? 1. linux是一个多用户系统 2. 权限管理(权限最小化) 用户:存在的 ...

  7. Android之使用传感器获取相应数据

    Android的大部分手机中都有传感器,传感器类型有方向.加速度(重力).光线.磁场.距离(临近性).温度等. 方向传感器:   Sensor.TYPE_ORIENTATION 加速度(重力)传感器: ...

  8. HTTP是什么连接

    ① 在HTTP/1.0中,默认使用的是短连接. 但从 HTTP/1.1起,默认使用长连接,用以保持连接特性. ②http长连接并不是一直保持连接 http的长连接也不会是永久保持连接,它有一个保持时间 ...

  9. tomcat+nginx实现均衡负载

    在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一些状况: 1.用户还在操作,被强迫终止了(我们可以看日志等没人操作的时候更新,但总可能会有万一) ...

  10. NYOJ 1277Decimal integer conversion (第九届河南省省赛)

    XiaoMing likes mathematics, and heis just learning how to convert numbers between different bases , ...