题意

题目链接

Sol

背板子背板子

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN = (1 << 17) + 10, mod = 998244353, inv2 = 499122177;
  4. inline int read() {
  5. char c = getchar(); int x = 0, f = 1;
  6. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  7. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  8. return x * f;
  9. }
  10. int N, A[MAXN], B[MAXN], C[MAXN];
  11. int add(int x, int y) {
  12. if(x + y < 0) return x + y + mod;
  13. return x + y >= mod ? x + y - mod : x + y;
  14. }
  15. int mul(int x, int y) {
  16. return 1ll * x * y % mod;
  17. }
  18. void FWTor(int *a, int opt) {
  19. for(int mid = 1; mid < N; mid <<= 1)
  20. for(int R = mid << 1, j = 0; j < N; j += R)
  21. for(int k = 0; k < mid; k++)
  22. if(opt == 1) a[j + k + mid] = add(a[j + k], a[j + k + mid]);
  23. else a[j + k + mid] = add(a[j + k + mid], -a[j + k]);
  24. }
  25. void FWTand(int *a, int opt) {
  26. for(int mid = 1; mid < N; mid <<= 1)
  27. for(int R = mid << 1, j = 0; j < N; j += R)
  28. for(int k = 0; k < mid; k++)
  29. if(opt == 1) a[j + k] = add(a[j + k], a[j + k + mid]);
  30. else a[j + k] = add(a[j + k], -a[j + k + mid]);
  31. }
  32. void FWTxor(int *a, int opt) {
  33. for(int mid = 1; mid < N; mid <<= 1)
  34. for(int R = mid << 1, j = 0; j < N; j += R)
  35. for(int k = 0; k < mid; k++) {
  36. int x = a[j + k], y = a[j + k + mid];
  37. if(opt == 1) a[j + k] = add(x, y), a[j + k + mid] = add(x, -y);
  38. else a[j + k] = mul(add(x, y), inv2), a[j + k + mid] = mul(add(x, -y), inv2);
  39. }
  40. }
  41. int main() {
  42. N = 1 << (read());
  43. for(int i = 0; i < N; i++) A[i] = read();
  44. for(int i = 0; i < N; i++) B[i] = read();
  45. FWTor(A, 1); FWTor(B, 1);
  46. for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
  47. FWTor(C, -1); FWTor(A, -1); FWTor(B, -1);
  48. for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
  49. FWTand(A, 1); FWTand(B, 1);
  50. for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
  51. FWTand(C, -1); FWTand(A, -1); FWTand(B, -1);
  52. for(int i = 0; i < N; i++) printf("%d ", C[i]); puts("");
  53. FWTxor(A, 1); FWTxor(B, 1);
  54. for(int i = 0; i < N; i++) C[i] = mul(A[i], B[i]);
  55. FWTxor(C, -1); FWTxor(A, -1); FWTxor(B, -1);
  56. for(int i = 0; i < N; i++) printf("%d ", C[i]);
  57. return 0;
  58. }

洛谷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. Keil RTX使用 os_mut_init 报Hard Fault 错误解决记录

    首先确定你的软件是在互斥信号初始化的位置,在以下几个位置,将会报Hard Fault 错误: (1).os_sys_init_user 用户线程创建之前 (2).os_tsk_create_user之 ...

  2. leetcode-479-Largest Palindrome Product(找到两个乘数相乘得到的最大的回文数)

    题目描述: Find the largest palindrome made from the product of two n-digit numbers. Since the result cou ...

  3. 小M的作物 最小割最大流

    题目描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一棵作物)(用1...n编号). 现在,第i种作物种植在A中种植可 ...

  4. [转] 遇见 TiDB - 分布式关系数据库

    [From] http://kuaibao.qq.com/s/20180510G0UFL000?refer=cp_1026 最近TiDB掀起了一波分布式数据库的热潮,公司也在着手准备TiDB的落地工作 ...

  5. (转)sysbench部署与参数详解

    sysbench部署 原文:https://wing324.github.io/2017/02/07/sysbench%E9%83%A8%E7%BD%B2/ sysbench作为每一个系统管理员,都应 ...

  6. C#多线程学习一

    一.概述:C#支持多线程并行执行程序,一个线程有他单独的执行路径,能够与其他线程同时执行,一个程序是由一个单线程开始,该单线程由CLR(公共语言运行时)和操作系统创建而成,并具有多线程创建额外线程的功 ...

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

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

  8. 【分步详解】两个有序数组中的中位数和Top K问题

    (这也是一道leetcode的经典题目:<LeetCode>解题笔记:004. Median of Two Sorted Arrays[H] 问题介绍 这是个超级超级经典的分治算法!!这个 ...

  9. Mac 安装Git

    一.安装 在进行安装前,要说一下,Git和SVN一样,都需要创建一个服务器的,他们都可以创建自己的版本管理服务器.对于个人和小团队来说,使用托管服务器可能更合适. 常见的有Github 和 Bitbu ...

  10. CentOS/Linux 解决 SSH 连接慢

    现在连接linux服务器一般都是使用SSH远程连接的方式.最近新装了一台服务器,发现telnet时速度很快,ping时一切也正常,但SSH连接的时候却很慢.经过网上资料查询,大致是有以下几种原因: 1 ...