题意

题目链接

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. 2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II

    1118 AlvinZH's Fight with DDLs II 思路 中等题,贪心. 理解题意,每次攻击中,可以使某个敌人生命值-1,自己生命值减去∑存活敌人总攻击力. 贪心思想,血量少攻击高的要 ...

  2. TX2 用文件IO的方式操作GPIO

    概述 通过 sysfs 方式控制 GPIO,先访问 /sys/class/gpio 目录,向 export 文件写入 GPIO 编号,使得该 GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的 ...

  3. Java将\替换成/

    public static void main(String[] args) { String str="upload\\media\\201904\\i4Qjz8E40xGQovUq-2C ...

  4. springcloud应用思考

    1 springcloud注册中心eureka和zookeeper注册中心的区别: eureka注册中心,在服务选主的时候服务还是可以用的,zookeeper注册中心在选举的时候整个服务瘫痪了,是不可 ...

  5. word里的字号与html字号的对应关系

    在word里输入一段文字,把文字调成需要的大小,即"三号或者小三",然后把文件另存为网页,在格式里选择“html”格式,然后把word关闭,将另存的html文件用编辑工具打开,就可 ...

  6. ubuntu 16.04安装后的简单优化

    1.更换更新源为国内源: sudo vim /etc/apt/sources.list vim 打开更新源配置文件添加国内源进去,这里添加阿里源 deb http://mirrors.aliyun.c ...

  7. C#枚举类型转换

    string 转 enum (自己定义的枚举类型)(Enum.Parse(typeof(自己定义的枚举类型), 待转字符串)); enum 转 string enum.Getname(typeof(自 ...

  8. ubuntu手动安装PhantomJS

    1.切换到主目录:cd ~2.下载安装包:https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-Linux-x86_64.ta ...

  9. Jira 6.0.5的详细安装及汉化授权

    第一步:安装jdk-6u24-windows-i586.exe (1)下载到oracle官网下装安装 jdk-6u24-windows-i586.exe,http://www.oracle.com/t ...

  10. 如何快速将文本中的tab更换成逗号(图文详解)

    不多说,直接上干货! 现有一份数据如下. 下载日志数据并分析 到搜狗实验室下载用户查询日志 1) 介绍 搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点 ...