前言

学多项式怎么能错过\(FWT\)呢,然而这真是个毒瘤的东西,蒟蒻就只会背公式了\(\%>\_<\%\)

或卷积

\[\begin{aligned}\\
tf(A) = (tf(A_0), tf(A_1) + tf(A_0))\\
utf(A) = (utf(A), utf(A_1) - utf(A_0))\\
\end{aligned}\]

与卷积

\[\begin{aligned}\\
tf(A) = (tf(A_0) + tf(A_1), tf(A_1))\\
utf(A) = (utf(A_0) - utf(A_1), utf(A_1))\\
\end{aligned}\]

异或卷积

\[\begin{aligned}\\
tf(A) = (tf(A_0) + tf(A_1), tf(A_0) - tf(A_1))\\
utf(A) = (\frac{utf(A_0) + utf(A_1)}{2}, \frac{utf(A_0) - utf(A_1)}{2})\\
\end{aligned}\]

Code

习惯写递归的非递归本来也不会

  1. #include<bits/stdc++.h>
  2. typedef int LL;
  3. inline LL Read(){
  4. LL x(0),f(1); char c=getchar();
  5. while(c<'0' || c>'9'){
  6. if(c=='-') f=-1; c=getchar();
  7. }
  8. while(c>='0' && c<='9'){
  9. x=(x<<3)+(x<<1)+c-'0'; c=getchar();
  10. }
  11. return x*f;
  12. }
  13. const LL mod=998244353,maxn=1<<18,inv2=499122177;
  14. inline LL Pow(LL base,LL b){
  15. LL ret(1);
  16. while(b){
  17. if(b&1) ret=1ll*ret*base%mod; base=1ll*base*base%mod; b>>=1;
  18. }
  19. return ret;
  20. }
  21. void Solve_or(LL n,LL *a,LL *b,LL *c){
  22. n>>=1;
  23. if(!n){
  24. c[0]=1ll*a[0]*b[0]%mod;
  25. return;
  26. }
  27. for(LL i=0;i<n;++i){
  28. a[i+n]=1ll*(a[i+n]+a[i])%mod; b[i+n]=1ll*(b[i+n]+b[i])%mod;
  29. }
  30. Solve_or(n,a,b,c); Solve_or(n,a+n,b+n,c+n);
  31. for(LL i=0;i<n;++i) c[i+n]=(c[i+n]-c[i]+mod)%mod;
  32. }
  33. void Solve_and(LL n,LL *a,LL *b,LL *c){
  34. n>>=1;
  35. if(!n){
  36. c[0]=1ll*a[0]*b[0]%mod;
  37. return;
  38. }
  39. for(LL i=0;i<n;++i){
  40. a[i]=1ll*(a[i]+a[i+n])%mod; b[i]=1ll*(b[i]+b[i+n])%mod;
  41. }
  42. Solve_and(n,a,b,c); Solve_and(n,a+n,b+n,c+n);
  43. for(LL i=0;i<n;++i) c[i]=1ll*(c[i]-c[i+n]+mod)%mod;
  44. }
  45. void Solve_xor(LL n,LL *a,LL *b,LL *c){
  46. n>>=1;
  47. if(!n){
  48. c[0]=1ll*a[0]*b[0]%mod;
  49. return;
  50. }
  51. for(LL i=0;i<n;++i){
  52. std::tie(a[i],a[i+n])=std::make_tuple(a[i]+a[i+n],a[i]-a[i+n]+mod);
  53. std::tie(b[i],b[i+n])=std::make_tuple(b[i]+b[i+n],b[i]-b[i+n]+mod);
  54. a[i]%=mod; a[i+n]%=mod; b[i]%=mod; b[i+n]%=mod;
  55. }
  56. Solve_xor(n,a,b,c); Solve_xor(n,a+n,b+n,c+n);
  57. for(LL i=0;i<n;++i){
  58. std::tie(c[i],c[i+n])=std::make_tuple(c[i]+c[i+n],c[i]-c[i+n]+mod);
  59. c[i]=1ll*c[i]%mod*inv2%mod; c[i+n]=1ll*c[i+n]%mod*inv2%mod;
  60. }
  61. }
  62. LL n,N;
  63. LL a[maxn],b[maxn],c[maxn],d[maxn],e[maxn],f[maxn],x[maxn],y[maxn],z[maxn];
  64. int main(){
  65. n=Read();
  66. N=1<<n;
  67. for(LL i=0;i<N;++i) a[i]=c[i]=e[i]=Read();
  68. for(LL i=0;i<N;++i) b[i]=d[i]=f[i]=Read();
  69. Solve_or(N,a,b,x);
  70. Solve_and(N,c,d,y);
  71. Solve_xor(N,e,f,z);
  72. for(LL i=0;i<N;++i) printf("%d ",x[i]);printf("\n");
  73. for(LL i=0;i<N;++i) printf("%d ",y[i]);printf("\n");
  74. for(LL i=0;i<N;++i) printf("%d ",z[i]);printf("\n");
  75. return 0;
  76. }

FWT快速沃尔什变换的更多相关文章

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

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

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

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

  3. 浅谈算法——FWT(快速沃尔什变换)

    其实FWT我啥都不会,反正就是记一波结论,记住就好-- 具体证明的话,推荐博客:FWT快速沃尔什变换学习笔记 现有一些卷积,形如 \(C_k=\sum\limits_{i\lor j=k}A_i*B_ ...

  4. 知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)

    知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j ...

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

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

  6. FWT快速沃尔什变换例题

    模板题 传送门 #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #de ...

  7. FWT快速沃尔什变换——基于朴素数学原理的卷积算法

    这是我的第一篇学习笔记,如有差错,请海涵... 目录 引子 卷积形式 算法流程 OR卷积 AND卷积 XOR卷积 模板 引子 首先,考虑这是兔子 数一数,会发现你有一只兔子,现在,我再给你一只兔子 再 ...

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

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

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

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

随机推荐

  1. Django学习笔记第十一篇--关于session

    一.session和sessionid: sessionid是cookie的一个字段,sessionid一般如下: """请求报文""" & ...

  2. 【BZOJ1070】[SCOI2007]修车 费用流

    [BZOJ1070][SCOI2007]修车 Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的. ...

  3. 【BZOJ4872】[Shoi2017]分手是祝愿 数学+期望DP

    [BZOJ4872][Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n ...

  4. iOS 按钮文字加划掉线

    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(, , , )]; NSDictionary *normalTitleAttribu ...

  5. 01.ZooKeeper安装和介绍

    1.ZooKeeper安装和启动 1.下载解压ZooKeeper ZooKeeper官方地址:http://zookeeper.apache.org/ 下载当前稳定版本:zookeeper-3.4.6 ...

  6. 170403、java 版cookie操作工具类

    package com.rick.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; imp ...

  7. Efficient data transfer through zero copy

    Efficient data transfer through zero copy https://www.ibm.com/developerworks/library/j-zerocopy/ Eff ...

  8. application/x-protobuf payload加密 知乎

  9. Bootstrap插件架构 基于元素自定义属性的布局规则

    w HTML布局规则 Javascript实现步骤 插件调用方法

  10. postfix邮箱服务器修改附件大小限制遇到的问题与解决

    Q1:邮件大小限制为30M,发送的附件大小为25M,发送后提示邮件大小超过限制 A:邮箱客户端在发送邮件时会把附件进行base64转码,转码之后邮件大小会超过附件+正文的大小,所以10M的附件在经过转 ...