点此看题面

大致题意: 有两个长度为\(2^n\)的数组\(A,B\),且\(C_i=\sum_{j⊕k==i}A_jB_k\)分别求出当\(⊕\)为\(or,and,xor\)时的\(C\)数组。

\(FWT\)

这是一道\(FWT\)的板子题。

由于\(FWT\)太难了,所以我只会背板子(甚至连板子都不会背)。

可见代码。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N (1<<17)
#define X 998244353
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define Dec(x,y) ((x-=(y))<0&&(x+=X))
#define XSum(x,y) ((x)+(y)>=X?(x)+(y)-X:(x)+(y))
#define XSub(x,y) ((x)-(y)<0?(x)-(y)+X:(x)-(y))
using namespace std;
int n,a[(N<<1)+5],b[(N<<1)+5],s1[(N<<1)+5],s2[(N<<1)+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn(x) (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn(x)+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
I void writec(Con char& x) {pc(x);}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
class FWT//FWT模板
{
private:
static const int SZ=N;int P,L;
I void TransformOr(int* s,CI op)//or
{
for(RI i=1,j,k;i^P;i<<=1) for(j=0;j^P;j+=(i<<1))
for(k=0;k^i;++k) ~op?Inc(s[i+j+k],s[j+k]):Dec(s[i+j+k],s[j+k]);
}
I void TransformAnd(int* s,CI op)//and
{
for(RI i=1,j,k;i^P;i<<=1) for(j=0;j^P;j+=(i<<1))
for(k=0;k^i;++k) ~op?Inc(s[j+k],s[i+j+k]):Dec(s[j+k],s[i+j+k]);
}
I void TransformXor(int* s,CI op)//xor
{
for(RI i=1,j,k,tx,ty;i^P;i<<=1) for(j=0;j^P;j+=(i<<1)) for(k=0;k^i;++k)
{
tx=s[j+k],ty=s[i+j+k],s[j+k]=XSum(tx,ty),s[i+j+k]=XSub(tx,ty),
!~op&&(s[j+k]=1LL*s[j+k]*(X+1>>1)%X,s[i+j+k]=1LL*s[i+j+k]*(X+1>>1)%X);
}
}
public:
I void Or(CI n,CI m,int* a,int* b)//处理or的情况
{
RI i,t=max(n,m);P=1,L=0;W(P<t) P<<=1,++L;
for(TransformOr(a,1),TransformOr(b,1),i=0;i^P;++i) a[i]=1LL*a[i]*b[i]%X;
TransformOr(a,-1);
}
I void And(CI n,CI m,int* a,int* b)//处理and的情况
{
RI i,t=max(n,m);P=1,L=0;W(P<t) P<<=1,++L;
for(TransformAnd(a,1),TransformAnd(b,1),i=0;i^P;++i) a[i]=1LL*a[i]*b[i]%X;
TransformAnd(a,-1);
}
I void Xor(CI n,CI m,int* a,int* b)//处理xor的情况
{
RI i,t=max(n,m);P=1,L=0;W(P<t) P<<=1,++L;
for(TransformXor(a,1),TransformXor(b,1),i=0;i^P;++i) a[i]=1LL*a[i]*b[i]%X;
TransformXor(a,-1);
}
}FWT;
int main()
{
RI i,l;for(F.read(n),n=1<<n,i=0;i^n;++i) F.read(a[i]);for(i=0;i^n;++i) F.read(b[i]);
for(i=0;i^n;++i) s1[i]=a[i],s2[i]=b[i];for(FWT.Or(n,n,s1,s2),i=0;i^n;++i) F.write(s1[i]),F.writec(' ');F.writec('\n');
for(i=0;i^n;++i) s1[i]=a[i],s2[i]=b[i];for(FWT.And(n,n,s1,s2),i=0;i^n;++i) F.write(s1[i]),F.writec(' ');F.writec('\n');
for(i=0;i^n;++i) s1[i]=a[i],s2[i]=b[i];for(FWT.Xor(n,n,s1,s2),i=0;i^n;++i) F.write(s1[i]),F.writec(' ');F.writec('\n');
return F.clear(),0;
}

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

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

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

  2. P4717 快速沃尔什变换FWT 模板题

    #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #def ...

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

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

  4. 快速沃尔什变换FWT

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

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

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

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

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

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

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

  8. 快速沃尔什变换 FWT 学习笔记【多项式】

    〇.前言 之前看到异或就担心是 FWT,然后才开始想别的. 这次学了 FWT 以后,以后判断应该就很快了吧? 参考资料 FWT 详解 知识点 by neither_nor 集训队论文 2015 集合幂 ...

  9. Codeforces 662C(快速沃尔什变换 FWT)

    感觉快速沃尔什变换和快速傅里叶变换有很大的区别啊orz 不是很明白为什么位运算也可以叫做卷积(或许不应该叫卷积吧) 我是看 http://blog.csdn.net/liangzhaoyang1/ar ...

随机推荐

  1. NET Core 不错教程***************

    Twinhead 当前标签: .Net Core   RabbitMQ教程 Twinhead 2019-01-26 20:02 阅读:5 评论:0     缓存击穿.缓存穿透和缓存雪崩 Twinhea ...

  2. 转 dango的模型总结 and django-关于manage.py migrate无效的问题

    http://iluoxuan.iteye.com/blog/1703061 1:用过django就知道django的model有多方便: 首先介绍下django的模型有哪些属性:先看例子: Djan ...

  3. ubuntu下安装wireshark(以及配置非root)

    https://jingyan.baidu.com/article/c74d60009d992f0f6a595de6.html Wireshark是世界上最流行的网络分析工具.这个强大的工具可以捕捉网 ...

  4. (转)总结Linux的chattr与lsattr命令详解

    PS:有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了.chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的li ...

  5. go语言初始化内部结构体3中方式

    package main import ( "fmt" ) type User struct { Id int Name string Age int } type Manger ...

  6. (初学)wpf仿QQ界面-整体布局

    跟一个小学弟一起学习wpf,小学弟是刚初中毕业,对编程刚刚接触,我挺怕自己带的不好,影响小学弟以后在编程方向的学习兴趣.我承认自己水平不高,但是在努力去学习新知识!一起加油吧!在此以博客,记录学习进度 ...

  7. Java学习笔记--继承和多态(中)

    1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...

  8. iOS 时间戳和时间互换,计算两日期相隔天数

    /*  *获取当前系统时间的时间戳  */ +(NSInteger)getNowTimestamp;   /**  * 获取当前时间  */ + (NSString *)getNowTimeTampF ...

  9. kafka存储机制以及offset

    1.前言 一个商业化消息队列的性能好坏,其文件存储机制设计是衡量一个消息队列服务技术水平和最关键指标之一.下面将从Kafka文件存储机制和物理结构角度,分析Kafka是如何实现高效文件存储,及实际应用 ...

  10. elasticsearch复杂查询-----2

    1.多条件查询 1)查询索引weibo下字段date大于或等于2015-09-05和name为Mary Jone的数据 2.简单查询 1)查询包含2014字符的数据 2)查询包含字符2014-09-1 ...