思路

FWT的模板

FWT解决这样的卷积

\[C_k=\sum_{i\otimes j=k} A_iB_j
\]

\(\otimes\)可能是and,or,xor等位运算

几个式子

FWTand:

\[a[k]+=a[k+len]
\]

IFWTand:

\[a[k]-=a[k+len]
\]

FWTor:

\[a[k+len]+=a[k]
\]

IFWTor:

\[a[k+len]-=a[k]
\]

FWTxor:

\[x=a[k]\\
y=a[k+len]\\
a[k]=x+y\\
a[k+len]=x-y
\]

IFWTxor:

\[x=a[k]\\
y=a[k+len]\\
a[k]=\frac{x+y}{2}\\
a[k+len]=\frac{x-y}{2}
\]

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int inv2 ,a[140000],b[140000],c[140000],n;
const int MOD = 998244353;
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(1LL*ans*a)%MOD;
a=(1LL*a*a)%MOD;
b>>=1;
}
return ans;
}
void FWTor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k+len]=(a[k+len]+a[k])%MOD;
}
}
void IFWTor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k+len]=(a[k+len]-a[k]+MOD)%MOD;
}
}
void FWTand(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k]=(a[k]+a[k+len])%MOD;
}
}
void IFWTand(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++)
a[k]=(a[k]-a[k+len]+MOD)%MOD;
}
}
void FWTxor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++){
int x=a[k],y=a[k+len];
a[k]=(x+y)%MOD;
a[k+len]=(x-y+MOD)%MOD;
}
}
}
void IFWTxor(int *a,int n){
for(int i=2;i<=n;i<<=1){
int len=i/2;
for(int j=0;j<n;j+=i)
for(int k=j;k<j+len;k++){
int x=a[k],y=a[k+len];
a[k]=1LL*(x+y)%MOD*inv2%MOD;
a[k+len]=1LL*(x-y+MOD)%MOD*inv2%MOD;
}
}
}
int main(){
inv2 = pow(2,MOD-2);
scanf("%d",&n);
for(int i=0;i<(1<<n);i++)
scanf("%d",&a[i]);
for(int i=0;i<(1<<n);i++)
scanf("%d",&b[i]);
int midlen=1;
while(midlen<(1<<n))
midlen<<=1;
FWTor(a,midlen);
FWTor(b,midlen);
for(int i=0;i<midlen;i++)
c[i]=(1LL*a[i]*b[i])%MOD;
IFWTor(a,midlen);
IFWTor(b,midlen);
IFWTor(c,midlen);
for(int i=0;i<(1<<n);i++)
printf("%d ",c[i]);
printf("\n"); FWTand(a,midlen);
FWTand(b,midlen);
for(int i=0;i<midlen;i++)
c[i]=(1LL*a[i]*b[i])%MOD;
IFWTand(a,midlen);
IFWTand(b,midlen);
IFWTand(c,midlen);
for(int i=0;i<(1<<n);i++)
printf("%d ",c[i]);
printf("\n"); FWTxor(a,midlen);
FWTxor(b,midlen);
for(int i=0;i<midlen;i++)
c[i]=(1LL*a[i]*b[i])%MOD;
IFWTxor(a,midlen);
IFWTxor(b,midlen);
IFWTxor(c,midlen);
for(int i=0;i<(1<<n);i++)
printf("%d ",c[i]);
printf("\n");
return 0;
}

P4717 【模板】快速沃尔什变换的更多相关文章

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

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

  2. LG4717 【模板】快速沃尔什变换

    题意 题目描述 给定长度为\(2^n\)两个序列\(A,B\),设\(C_i=\sum_{j\oplus k}A_jB_k\)分别当\(\oplus\)是or,and,xor时求出C 输入输出格式 输 ...

  3. 快速沃尔什变换(FWT)学习笔记

    概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x)  即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^ ...

  4. 初学FWT(快速沃尔什变换) 一点心得

    FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi​=j⊕k=i∑​Aj​∗Bk​此处乘号为普通乘法 ...

  5. Fast Walsh-Hadamard Transform——快速沃尔什变换

    模板题: 给定$n = 2^k$和两个序列$A_{0..n-1}$, $B_{0..n-1}$,求 $$C_i = \sum_{j \oplus k = i} A_j B_k$$ 其中$\oplus$ ...

  6. [学习笔记]FWT——快速沃尔什变换

    解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...

  7. 快速沃尔什变换(FWT)笔记

    开头Orz hy,Orz yrx 部分转载自hy的博客 快速沃尔什变换,可以快速计算两个多项式的位运算卷积(即and,or和xor) 问题模型如下: 给出两个多项式$A(x)$,$B(x)$,求$C( ...

  8. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面

    前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...

  9. 关于快速沃尔什变换(FWT)的一点学习和思考

    最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...

  10. FWT快速沃尔什变换学习笔记

    FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...

随机推荐

  1. IP,IP地址,mac地址

    IP地址与IP是两个不同的概念.单独讲IP,是指IP协议 IP地址分为三类:单播地址(目的为单个主机):多播地址(目的端为同一组的所有主机):广播地址(目的端为网络上所有给定的主机) ip地址由网络和 ...

  2. Spring cloud之Eureka(二)注册中心高可用

    背景 在实际的生产环境中,注册中心如果只有一个,是很危险的,当这个注册中心由于各种原因不能提供正常服务或者挂掉时,整个系统都会崩溃,这是很致命的的,所以在Spring cloud 设计之初就考虑到了注 ...

  3. 洛谷P4456 交错序列[CQOI2018] dp+数论

    正解:dp 解题报告: 传送门 首先可以先拆下这个贡献式,为了方便之后设状态什么的,把式子转成和ny有关,就成了 \(\sum \left ( n-i \right )^{a}\cdot i^{b}\ ...

  4. JAVA反射机制及理解

    JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...

  5. git提交代码时,Unstaged changes如何过滤.class .log等文件

    在项目下创建一个.gitignore文件,内容如下: 可以在文件目录中加入这个文件,也可以在eclipse中项目下加入此文件 /target/表示忽略target文件夹下的内容 .class 表示忽略 ...

  6. Java-接口(interface)

    1.1接口的定义 java中接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 接口 ...

  7. 使用Apache JMeter对SQL Server、Mysql、Oracle压力测试(二)

    接着第一篇的写: 第三步,测试SQL Server数据库的性能: a.加载JDBC SQL Server驱动.添加线程组和设置线程属性和第二步一样,就不再赘述了: b.设置JDBC Connectio ...

  8. Cocos Creator cc.Button (脚本事件内容)

    cc.Class({extends: cc.Component,properties: {}, onLoad: function () { var clickEventHandler = new cc ...

  9. crypto 简单了解

    阅读前:文章记录crypto库的简单了解,和一些简单的用法,与具体加解密算法的实现无关. 文中例子使用到了node的crypto模块 和  npm sjcl(Stanford Javascript C ...

  10. Qt如何在QTabWidget上绘图

    Qt绘图事件必须在paintEvent事件下绘图,这样导致我们在向Qt设计师界面上拖拽的控件绘图时,造成了很大的麻烦. 我们不能在拖拽的控件上写paintEvent函数,但是可以自定义一个类,继承某一 ...