P4717 【模板】快速沃尔什变换
思路
FWT的模板
FWT解决这样的卷积
\]
\(\otimes\)可能是and,or,xor等位运算
几个式子
FWTand:
\]
IFWTand:
\]
FWTor:
\]
IFWTor:
\]
FWTxor:
y=a[k+len]\\
a[k]=x+y\\
a[k+len]=x-y
\]
IFWTxor:
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 【模板】快速沃尔什变换的更多相关文章
- 洛谷.4717.[模板]快速沃尔什变换(FWT)
题目链接 https://www.mina.moe/archives/7598 //285ms 3.53MB #include <cstdio> #include <cctype&g ...
- LG4717 【模板】快速沃尔什变换
题意 题目描述 给定长度为\(2^n\)两个序列\(A,B\),设\(C_i=\sum_{j\oplus k}A_jB_k\)分别当\(\oplus\)是or,and,xor时求出C 输入输出格式 输 ...
- 快速沃尔什变换(FWT)学习笔记
概述 FWT的大体思路就是把要求的 C(x)=A(x)×B(x) 即 \( c[i]=\sum\limits_{j?k=i} (a[j]*b[k]) \) 变换成这样的:\( c^{'}[i]=a^ ...
- 初学FWT(快速沃尔什变换) 一点心得
FWT能解决什么 有的时候我们会遇到要求一类卷积,如下: Ci=∑j⊕k=iAj∗Bk\large C_i=\sum_{j⊕k=i}A_j*B_kCi=j⊕k=i∑Aj∗Bk此处乘号为普通乘法 ...
- 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$ ...
- [学习笔记]FWT——快速沃尔什变换
解决涉及子集配凑的卷积问题 一.介绍 1.基本用法 FWT快速沃尔什变换学习笔记 就是解决一类问题: $f[k]=\sum_{i\oplus j=k}a[i]*b[j]$ 基本思想和FFT类似. 首先 ...
- 快速沃尔什变换(FWT)笔记
开头Orz hy,Orz yrx 部分转载自hy的博客 快速沃尔什变换,可以快速计算两个多项式的位运算卷积(即and,or和xor) 问题模型如下: 给出两个多项式$A(x)$,$B(x)$,求$C( ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
- 关于快速沃尔什变换(FWT)的一点学习和思考
最近在学FWT,抽点时间出来把这个算法总结一下. 快速沃尔什变换(Fast Walsh-Hadamard Transform),简称FWT.是快速完成集合卷积运算的一种算法. 主要功能是求:,其中为集 ...
- FWT快速沃尔什变换学习笔记
FWT快速沃尔什变换学习笔记 1.FWT用来干啥啊 回忆一下多项式的卷积\(C_k=\sum_{i+j=k}A_i*B_j\) 我们可以用\(FFT\)来做. 甚至在一些特殊情况下,我们\(C_k=\ ...
随机推荐
- centos7内核升级及curl访问https证书过期处理
centos7内核升级及curl访问https证书过期处理 先看下当前系统的linux内核版本 uname -r 3.10.0-229.el7.x86_64 升级步骤 1.rpm --import h ...
- python摸爬滚打之day032 管道 数据共享 进程池
1.进程池 当有成千上万个任务需要被执行的时候,有了进程池我们就不必去创建大量的进程. 首先,创建进程需要消耗时间,销毁进程(空间,变量,文件信息等等的内容)也需要消耗时间, 第二即便开启了成千上万的 ...
- SQL行转列与列转行(转)
原文: http://blog.csdn.net/jx_870915876/article/details/52403472 add by zhj: 本文是以MySQL为例说明的,但其实它适用于所有关 ...
- zabbix监控特定脚本有无生成
1.由于权限问题,zabbix不能直接查看其它用户目录下的文件,修改sudo文件使zabbix用户能以root身份执行test命令 visudo zabbix ALL=(root) NOPASSWD: ...
- [ML] 数据处理
可以不需要自己开发,使用CloudCompare的分割合并功能实现点云标注(labeling),生成点云训练集数据. (1)首先对点云中的物体进行分割,分割出一个一个的类别. (2)接着删除所有的SF ...
- 学习了clipboard复制剪切插件的使用
第一步:引入clipboard插件JS <script src="dist/clipboard.min.js"></script> 第二步:在HTML代码加 ...
- visual studio 中被遗忘的任务列表和书签
任务列表(Task List)是VS中被人遗忘的一个功能,用到跳转到不同的代码段非常不便.以后就不用每次前进和后退导航了. 使用“任务列表” 跟踪使用 TODO 和 HACK或自定义令牌等令牌的代码注 ...
- 用html5实现音频播放器
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- http协议状态码及其意义
什么是状态码? 状态码的作用是:服务器告诉客户端,发生了什么事. 在http协议中状态码出现在http response 的第一行.它会返回一个三位数的状态码和状态信息.状态码为了便于程序进行处理,而 ...
- python小程序--one
#!/usr/bin/env python # _*_ coding:utf8 _*_ import sys user_lock_file="user_lock.txt" # 用户 ...