正题

题目链接:https://www.luogu.com.cn/problem/P4717


题目大意

给出两个长度为2n2^n2n的数列A,BA,BA,B求
Cn=∑iorj=nAiBjC_{n}=\sum_{i\ or\ j=n}A_iB_jCn​=i or j=n∑​Ai​Bj​
Cn=∑iandj=nAiBjC_{n}=\sum_{i\ and\ j=n}A_iB_jCn​=i and j=n∑​Ai​Bj​
Cn=∑ixorj=nAiBjC_{n}=\sum_{i\ xor\ j=n}A_iB_jCn​=i xor j=n∑​Ai​Bj​


解题思路

和FFTFFTFFT一样的思路,我们需要将A,BA,BA,B转换为点集表达式相乘再转回去,这里就直接抛结论了。

对于ororor有FWT(A)=(FWT(A),FWT(A)+FWT(B))FWT(A)=(FWT(A),FWT(A)+FWT(B))FWT(A)=(FWT(A),FWT(A)+FWT(B))

IFWT(A)=(IFWT(A),IFWT(A)−IFWT(B))IFWT(A)=(IFWT(A),IFWT(A)-IFWT(B))IFWT(A)=(IFWT(A),IFWT(A)−IFWT(B))
对于andandand有FWT(A)=(FWT(A)+FWT(B),FWT(B))FWT(A)=(FWT(A)+FWT(B),FWT(B))FWT(A)=(FWT(A)+FWT(B),FWT(B))

IFWT(A)=(IFWT(A)−IFWT(B),IFWT(B))IFWT(A)=(IFWT(A)-IFWT(B),IFWT(B))IFWT(A)=(IFWT(A)−IFWT(B),IFWT(B))
对于xorxorxor有FWT(A)=(FWT(A)+FWT(B),FWT(A)−FWT(B))FWT(A)=(FWT(A)+FWT(B),FWT(A)-FWT(B))FWT(A)=(FWT(A)+FWT(B),FWT(A)−FWT(B))

IFWT(A)=(IFWT(A)+IFWT(B)2,IFWT(A)−IFWT(B)2)IFWT(A)=(\frac{IFWT(A)+IFWT(B)}{2},\frac{IFWT(A)-IFWT(B)}{2})IFWT(A)=(2IFWT(A)+IFWT(B)​,2IFWT(A)−IFWT(B)​)
因为不用转成虚数所以代码好写很多,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll inv2=499122177,N=(1<<18),P=998244353;
ll lg,n,aa[N],bb[N],a[N],b[N],c[3][N];void mul(ll *c,ll *a,ll *b){for(ll i=0;i<n;i++)c[i]=a[i]*b[i]%P;return;
}void FWT_or(ll *f,ll op){for(ll p=2;p<=n;p<<=1){ll len=p>>1;for(ll k=0;k<n;k+=p)for(ll i=k;i<k+len;i++)(f[i+len]+=f[i]*op+P)%=P;}return;
}
void solve_or(ll *c){memcpy(a,aa,sizeof(a));memcpy(b,bb,sizeof(b));FWT_or(a,1);FWT_or(b,1);mul(c,a,b); FWT_or(c,P-1);return;
}void FWT_and(ll *f,ll op){for(ll p=2;p<=n;p<<=1){ll len=p>>1;for(ll k=0;k<n;k+=p)for(ll i=k;i<k+len;i++)(f[i]+=f[i+len]*op+P)%=P;}return;
}
void solve_and(ll *c){memcpy(a,aa,sizeof(a));memcpy(b,bb,sizeof(b));FWT_and(a,1);FWT_and(b,1);mul(c,a,b); FWT_and(c,P-1);return;
}void FWT_xor(ll *f,ll op){for(ll p=2;p<=n;p<<=1){ll len=p>>1;for(ll k=0;k<n;k+=p)for(ll i=k;i<k+len;i++){ll x=f[i],y=f[i+len];f[i]=(x+y)*op%P;f[i+len]=(x-y+P)*op%P;}}return;
}
void solve_xor(ll *c){memcpy(a,aa,sizeof(a));memcpy(b,bb,sizeof(b));FWT_xor(a,1);FWT_xor(b,1);mul(c,a,b); FWT_xor(c,inv2);return;
}signed main()
{scanf("%lld",&lg);n=1<<lg;for(ll i=0;i<n;i++)scanf("%lld",&aa[i]);for(ll i=0;i<n;i++)scanf("%lld",&bb[i]);solve_or(c[0]);solve_and(c[1]);solve_xor(c[2]);for(ll i=0;i<n;i++)printf("%lld ",c[0][i]);putchar('\n');for(ll i=0;i<n;i++)printf("%lld ",c[1][i]);putchar('\n');for(ll i=0;i<n;i++)printf("%lld ",c[2][i]);putchar('\n');return 0;
}

P4717-[模板]快速莫比乌斯/沃尔什变换(FMT/FWT)相关推荐

  1. 洛谷 - P4717 【模板】快速莫比乌斯/沃尔什变换 (FMT/FWT)

    题目链接:点击查看 题目分析:看不懂原理我爪巴了 代码: // Problem: P4717 [模板]快速莫比乌斯/沃尔什变换 (FMT/FWT) // Contest: Luogu // URL: ...

  2. FFT/NTT/FMT/FWT题目

    快速傅里叶变换FFT hdu4609 3-idiots P4173 残缺的字符串 Hash Function [AH2017/HNOI2017]礼物 CF993E Nikita and Order S ...

  3. 模板:快速莫比乌斯变换(FMT)+快速沃尔什变换(FWT)(多项式)

    文章目录 前言 解析 OR 定义 变换: 逆变换 代码 AND 代码 XOR 定义 变换 逆变换 代码 所谓快速沃尔什变换,就是快速的沃尔玛什锦专柜变换 (逃) 前言 正常卷积的定义:ck=∑i+j= ...

  4. [模板] 快速沃尔什变换

    快速沃尔什变换 快速沃尔什变换是求这样的式子: 对序列 \(A\), \(B\), 求序列 \(C\), 使得 \[ C_{i}=\sum_{j \oplus k} A_{j} B_{k} \] 其中 ...

  5. 快速沃尔什变换(FWT)介绍

    快速沃尔什变换(FWT)介绍 众所周知,FFT可以有效地解决如下的问题 A=(a1,-,an)B=(b1,...,bn)C=(c1,...,cn)ck=∑i+j=kai∗bjA=(a_1,\dots, ...

  6. T4模板:MVC中用T4模板快速生成代码

    T4模板快速生成代码: 以快速生Dal文件为例,下面为T4模板文件的内容 <#@ template debug="false" hostspecific="true ...

  7. php快速搭建后台,基于thinkphp的后台管理系统模板快速搭建,thinkphp后台模板_PHP教程...

    基于thinkphp的后台管理系统模板快速搭建,thinkphp后台模板 当我们在搭建网站的时候,后端开发人员在编写后台的管理系统的时候,往往会因为缺少一个合适的后台管理系统的模板,而必须去重新编写一 ...

  8. 使用模板快速制作H5网页(仅供参考)

    #[转载] 使用模板快速制作H5网页(仅供参考) 教程来源: 零基础30分钟学会制作网站--如何使用HTML网页模板(更新P2字幕版) 作者:SolidifieRay 1.HTML整体框架: < ...

  9. SpringBoot集成beetl模板快速入门

    SpringBoot集成beetl模板快速入门 本文引导 SpringBoot集成beetl模板快速入门 创建SpringBoot工程(idea) 新建工程 修改maven本地仓库位置 配置Sprin ...

  10. 快速沃尔什变换(FWT)讲解 解决集合卷积的方法

    由于某次CSDN更新,文章样式已经丢失,大量公式无法正常显示,本博客也不再维护. 请到快速沃尔什变换FWT查看,有更加完整的公式讲解. 能看到这篇博客的人,一定知道FWT是干什么的.(什么?你不知道? ...

最新文章

  1. 西部985,进军北京!
  2. MySQL5.6 新特性(全局事务标示符(GTID))
  3. 在C#中调用一个dll函数,其中有个参数为 hdc,如何在C#中得到这个值并传给这个参数呢?
  4. 关于tomcat Post 数据参数的问题
  5. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 25丨不同性别每日分数总计【难度中等】​
  6. 三种背包问题的例题(各一道)
  7. 用HQL进行实体查询
  8. [转载] flutter开发桌面程序_在开始使用Flutter开发应用程序之前要了解的5条提示
  9. vi - vim的一些遗忘点
  10. 蓝桥杯2016年第七届C/C++省赛B组第三题-凑算式
  11. springMVC接受括号乱码
  12. windows10桌面_Windows10桌面美化之Dock栏指南
  13. C++学生信息管理系统
  14. 字节学妹的数据分析笔记,收藏
  15. 加壳、脱壳以及如何病毒免杀技术与原理
  16. STM32定时器US延时
  17. CST电磁仿真GPU计算工作站、集群最新配置推荐2022
  18. MAVEN 引入jar包没问题,但是程序中使用jar中的类报错的坑
  19. 教程篇(7.0) 11. FortiGate安全 入侵防御和拒绝服务 ❀ Fortinet 网络安全专家 NSE 4
  20. Vue中的vm和VueComponent的实例对象

热门文章

  1. 关于DOM的知识点总结
  2. Delphi Math单元函数
  3. 修改NPM的默认安装路径
  4. (How to)使用IE9的F12开发人员工具分析模拟登陆网站(百度首页)的内部逻辑过程
  5. 一招解决GitHub致命的下载速度(GitHub下载速度慢怎么办)
  6. Frame Bounds 区别
  7. 用一行`CSS`实现10种布局
  8. Swift - 实现公历、农历日期之间的相互转换
  9. ubuntu18.04安装kinect1(xbox360)驱动以及实时运行rtabmap
  10. 励志:滴滴打车CTO张博:生死战役,技术和时间赛跑