题意

题目链接

Sol

背板子背板子

#include<bits/stdc++.h>
using namespace std;
const int MAXN = (1 << 17) + 10, mod = 998244353, inv2 = 499122177;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, A[MAXN], B[MAXN], C[MAXN];
int add(int x, int y) {
if(x + y < 0) return x + y + mod;
return x + y >= mod ? x + y - mod : x + y;
}
int mul(int x, int y) {
return 1ll * x * y % mod;
}
void FWTor(int *a, int opt) {
for(int mid = 1; mid < N; mid <<= 1)
for(int R = mid << 1, j = 0; j < N; j += R)
for(int k = 0; k < mid; k++)
if(opt == 1) a[j + k + mid] = add(a[j + k], a[j + k + mid]);
else a[j + k + mid] = add(a[j + k + mid], -a[j + k]);
}
void FWTand(int *a, int opt) {
for(int mid = 1; mid < N; mid <<= 1)
for(int R = mid << 1, j = 0; j < N; j += R)
for(int k = 0; k < mid; k++)
if(opt == 1) a[j + k] = add(a[j + k], a[j + k + mid]);
else a[j + k] = add(a[j + k], -a[j + k + mid]);
}
void FWTxor(int *a, int opt) {
for(int mid = 1; mid < N; mid <<= 1)
for(int R = mid << 1, j = 0; j < N; j += R)
for(int k = 0; k < mid; k++) {
int x = a[j + k], y = a[j + k + mid];
if(opt == 1) a[j + k] = add(x, y), a[j + k + mid] = add(x, -y);
else a[j + k] = mul(add(x, y), inv2), a[j + k + mid] = mul(add(x, -y), inv2);
} }
int main() {
N = 1 << (read());
for(int i = 0; i < N; i++) A[i] = read();
for(int i = 0; i < N; i++) B[i] = read();
FWTor(A, 1); FWTor(B, 1);
for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
FWTor(C, -1); FWTor(A, -1); FWTor(B, -1);
for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
FWTand(A, 1); FWTand(B, 1);
for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
FWTand(C, -1); FWTand(A, -1); FWTand(B, -1);
for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
FWTxor(A, 1); FWTxor(B, 1);
for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
FWTxor(C, -1); FWTxor(A, -1); FWTxor(B, -1);
for(int i = 0; i < N; i++) printf("%d ", C[i]);
return 0;
}

洛谷P4717 【模板】快速沃尔什变换(FWT)的更多相关文章

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

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

  2. 快速沃尔什变换(FWT)学习笔记 + 洛谷P4717 [模板]

    FWT求解的是一类问题:\( a[i] = \sum\limits_{j\bigoplus k=i}^{} b[j]*c[k] \) 其中,\( \bigoplus \) 可以是 or,and,xor ...

  3. 一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记

    一个数学不好的菜鸡的快速沃尔什变换(FWT)学习笔记 曾经某个下午我以为我会了FWT,结果现在一丁点也想不起来了--看来"学"完新东西不经常做题不写博客,就白学了 = = 我没啥智 ...

  4. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  5. 快速沃尔什变换FWT

    快速沃尔什变换\(FWT\) 是一种可以快速完成集合卷积的算法. 什么是集合卷积啊? 集合卷积就是在集合运算下的卷积.比如一般而言我们算的卷积都是\(C_i=\sum_{j+k=i}A_j*B_k\) ...

  6. 集合并卷积的三种求法(分治乘法,快速莫比乌斯变换(FMT),快速沃尔什变换(FWT))

    也许更好的阅读体验 本文主要内容是对武汉市第二中学吕凯风同学的论文<集合幂级数的性质与应用及其快速算法>的理解 定义 集合幂级数 为了更方便的研究集合的卷积,引入集合幂级数的概念 集合幂级 ...

  7. 【学习笔鸡】快速沃尔什变换FWT

    [学习笔鸡]快速沃尔什变换FWT OR的FWT 快速解决: \[ C[i]=\sum_{j|k=i} A[j]B[k] \] FWT使得我们 \[ FWT(C)=FWT(A)*FWT(B) \] 其中 ...

  8. FWT模板(洛谷P4717 【模板】快速沃尔什变换)(FWT)

    洛谷题目传送门 只是一个经过了蛇皮压行的模板... 总结?%%%yyb%%% #include<bits/stdc++.h> #define LL long long #define RG ...

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

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

  10. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

随机推荐

  1. Java NIO学习与记录(三): Scatter&Gather介绍及使用

     Scatter&Gather介绍及使用 上一篇知道了Buffer的工作机制,以及FileChannel的简单用法,这一篇介绍下 Scatter&Gather 1.Scatter(分散 ...

  2. [转] HBase异常:hbase-default.xml file seems to be for an old version of HBase

    [From] https://blog.yoodb.com/yoodb/article/detail/157 使用HBase Java Client连接HBase服务端创建Configuration对 ...

  3. 关于Matlab串口发送HEX格式字符

    终于想起来更新一下关于使用Matlab串口发送HEX格式字符.这个用法主要来自于我使用Matlab对机器人进行实时轨迹跟踪的绘制,由于底层限制,自己又不想在中间增加转换模块,就需要直接发送HEX格式指 ...

  4. Mac 10.12安装OpenVPN客户端

    说明: 1.在Mac下有很多漂亮的客户端可以安装,比如Tunnelblick这些等等. 2.但这里直接先原版的OpenVPN进行搭建,这个比较爽. 安装: brew install openvpn 提 ...

  5. [Xamarin.Android]使用Java Bindings Libary專案 Binding Java元件(.jar) 與Metadata.xml、型別對應 (转帖)

    使用Xamarin開發Android APP時, 如果已經有原本就用Java寫好的套件(.jar), 就可以利用Xamarin提供的Java Bindings Libary將他變成C#可使用的元件. ...

  6. 【MPI】执行mpiexec出错

    运行mpiexec提示mpiexec_mic: cannot connect to local mpd (/tmp/mpd2.console_jzhang); possible causes: 1. ...

  7. maven开发项目中遇到的问题 StartChild.call at java.util.concurrent.FutureTask.run

    这个原因是没有配置 pom中没有配置 <scope>provided</scope>  导致冲突 正确的配置文件如下 <project xmlns="http: ...

  8. Git提交项目到GitHub

    一.GitHub新建项目 1.进入Github首页,点击New repository新建一个项目 2.填写相应信息后点击create即可 Repository name: 仓库名称 Descripti ...

  9. Android的网络编程

    1.3主要接口 Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口).Org.apache接口和Android.net.*(Android网络接口).下面分别 ...

  10. VisualSVN Server提供程序无法执行所尝试的操作 0x80041024

    VisualSVN安装后没有提供VisualSVN Server Manager的快捷方式,如下图: 可以在安装目录的bin文件夹下找到VisualSVN Server.msc,添加快捷方式.建议Vi ...