题目链接

https://www.mina.moe/archives/7598

  1. //285ms 3.53MB
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <cstring>
  5. #include <algorithm>
  6. //#define gc() getchar()
  7. #define MAXIN 300000
  8. #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
  9. #define inv2 499122177
  10. #define mod 998244353
  11. #define Add(x,y) (x+y>=mod?x+y-mod:x+y)
  12. #define Sub(x,y) (x<y?x-y+mod:x-y)
  13. typedef long long LL;
  14. const int N=(1<<17)+5;
  15. int A[N],B[N],C[N],tA[N],tB[N];
  16. char IN[MAXIN],*SS=IN,*TT=IN;
  17. inline int read()
  18. {
  19. int now=0;register char c=gc();
  20. for(;!isdigit(c);c=gc());
  21. for(;isdigit(c);now=now*10+c-'0',c=gc());
  22. return now;
  23. }
  24. void FWT_OR(int *a,int lim,int opt)
  25. {
  26. for(int i=2; i<=lim; i<<=1)
  27. for(int j=0,mid=i>>1; j<lim; j+=i)
  28. for(int k=j; k<j+mid; ++k)
  29. if(opt==1) a[k+mid]=Add(a[k+mid],a[k]);
  30. else a[k+mid]=Sub(a[k+mid],a[k]);
  31. }
  32. void FWT_AND(int *a,int lim,int opt)
  33. {
  34. for(int i=2; i<=lim; i<<=1)
  35. for(int j=0,mid=i>>1; j<lim; j+=i)
  36. for(int k=j; k<j+mid; ++k)
  37. if(opt==1) a[k]=Add(a[k],a[k+mid]);
  38. else a[k]=Sub(a[k],a[k+mid]);
  39. }
  40. void FWT_XOR(int *a,int lim,int opt)
  41. {
  42. for(int i=2; i<=lim; i<<=1)
  43. for(int j=0,mid=i>>1; j<lim; j+=i)
  44. for(int k=j,x,y; k<j+mid; ++k)
  45. {
  46. x=a[k], y=a[k+mid];
  47. a[k]=Add(x,y), a[k+mid]=Sub(x,y);
  48. if(opt==-1) a[k]=1ll*a[k]*inv2%mod, a[k+mid]=1ll*a[k+mid]*inv2%mod;
  49. }
  50. }
  51. int main()
  52. {
  53. int n=1<<read();
  54. for(int i=0; i<n; ++i) tA[i]=read();
  55. for(int i=0; i<n; ++i) tB[i]=read();
  56. memcpy(A,tA,sizeof A), memcpy(B,tB,sizeof B);
  57. FWT_OR(A,n,1), FWT_OR(B,n,1);
  58. for(int i=0; i<n; ++i) C[i]=1ll*A[i]*B[i]%mod;
  59. FWT_OR(C,n,-1);
  60. for(int i=0; i<n; ++i) printf("%d ",C[i]);
  61. putchar('\n'); //FWT_OR(A,n,-1), FWT_OR(B,n,-1);
  62. memcpy(A,tA,sizeof A), memcpy(B,tB,sizeof B);
  63. FWT_AND(A,n,1), FWT_AND(B,n,1);
  64. for(int i=0; i<n; ++i) C[i]=1ll*A[i]*B[i]%mod;
  65. FWT_AND(C,n,-1);
  66. for(int i=0; i<n; ++i) printf("%d ",C[i]);
  67. putchar('\n');
  68. memcpy(A,tA,sizeof A), memcpy(B,tB,sizeof B);
  69. FWT_XOR(A,n,1), FWT_XOR(B,n,1);
  70. for(int i=0; i<n; ++i) C[i]=1ll*A[i]*B[i]%mod;
  71. FWT_XOR(C,n,-1);
  72. for(int i=0; i<n; ++i) printf("%d ",C[i]);
  73. putchar('\n');
  74. return 0;
  75. }

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

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

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

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

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

  3. 快速沃尔什变换FWT

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

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

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

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

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

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

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

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

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

  8. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  9. 洛谷.3803.[模板]多项式乘法(FFT)

    题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...

随机推荐

  1. python 退出程序的方式

    python程序退出方式[sys.exit() os._exit() os.kill() os.popen(...)] 知乎说明 http://www.zhihu.com/question/21187 ...

  2. 身份证号校验原理及JavaScript实现

          在网站中,总有各种各样的表单,用户使用表单来向服务器发送数据,进行交互. 然而,代代相传的经验是,永远不要信任用户的输入,一定要对数据进行验证.如果使用不经验证的表单,轻则会有大量无效提交 ...

  3. SharePoint 2013 Workflow Manager 1.0 远程服务器返回错误: (400) 错误的请求。 不支持查询字符串中的 api-version

    环境: Windows Server 2012 R2 Standard SharePoint Server 2013 with sp1 通过Web 平台安装程序 5.0,已安装 Workflow Ma ...

  4. VC++文件拖放

    属性Accept Files 设置True,消息WM_DROPFILES 设置事件OnDropFiles void CNWiReworkDlg::OnDropFiles(HDROP hDropInfo ...

  5. EntityFramework codefirst Enable-Migrations No context type was found in the assembly “MyApp.Web” error

    Enable-Migrations -Force -ContextTypeName "MyApp.Repository.DataContext" -ProjectName &quo ...

  6. 生活工作必备之SMART原则

    所谓SMART原则,即: 1. 目标必须是具体的(Specific) 2. 目标必须是可以衡量的(Measurable) 3. 目标必须是可以达到的(Attainable) 4. 目标必须和主要目标具 ...

  7. DOM绑定事件

    addEventListener(event,function,useCapture)event:事件名,比如clickuseCapture布尔值,指定事件是否在捕获或冒泡阶段执行. 可能值: tru ...

  8. java多线程快速入门(七)

    什么是守护线程 守护线程是为用户线程服务的这么一个线程,主线程结束,守护线程也结束 package com.cppdy; class MyThread3 extends Thread{ @Overri ...

  9. 读取本地图片 BitmapImage

    BitmapImage defImage = new BitmapImage(); defImage.BeginInit(); defImage.UriSource = new Uri(@" ...

  10. 并发之线程封闭与ThreadLocal解析

    并发之线程封闭与ThreadLocal解析 什么是线程封闭 实现一个好的并发并非易事,最好的并发代码就是尽量避免并发.而避免并发的最好办法就是线程封闭,那什么是线程封闭呢? 线程封闭(thread c ...