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

文章目录

  • 前言
  • 解析
    • OR
      • 定义
      • 变换:
      • 逆变换
      • 代码
    • AND
      • 代码
    • XOR
      • 定义
      • 变换
      • 逆变换
      • 代码

所谓快速沃尔什变换,就是快速的沃尔玛什锦专柜变换

(逃)

前言

正常卷积的定义:ck=∑i+j=kaibjc_k=\sum_{i+j=k}a_ib_jck=i+j=kaibj
可以用FFT或者NTT在 O(nlog⁡n)O(n\log n)O(nlogn) 的复杂度内解决。
然而,有些时候,我们计算卷积的时候下标关系并不是喜闻乐见的加法,而是形如 ck=∑i⊕j=kaibjc_k=\sum_{i\oplus j=k}a_ib_jck=ij=kaibj,其中的 ⊕\oplusand or xor 中的一种位运算。
这个时候就需要快速莫比乌斯变换(and or)和快速沃尔什变换(xor),同样可以把复杂度降到 O(nlog⁡n)O(n\log n)O(nlogn) 级别。

解析

由于三个运算思想比较类似,因此不对两个算法进行特别的区分,统称为FWT。
采用类比的思想,FFT先把多项式转化为点值表示,乘到一起,最后再反演回去。
类似的,FWT也是先把多项式 A,BA,BA,B 转化为某种变换 FWT⁡(A),FWT⁡(B)\operatorname{FWT}(A),\operatorname{FWT}(B)FWT(A),FWT(B),然后乘起来得到 FWT⁡(C)\operatorname{FWT}(C)FWT(C),最后再反演回去得到 CCC
根据不同位运算的性质,对应的变换有所不同。

OR

定义

求:ck=∑i∣⁡j=kaibjc_k=\sum_{i\operatorname{|}j=k}a_ib_jck=ij=kaibj
考虑或运算有如下性质:若 i∣k=k,j∣k=ki|k=k,j|k=kik=k,jk=k,那么 (i∣j)∣k=k(i|j)|k=k(ij)k=k,反之亦然。
那么我们就按照这个充要条件设计变换:FWT⁡or(A)k=∑i∣k=kAi\operatorname{FWT}_{or}(A)_k=\sum_{i|k=k}A_iFWTor(A)k=ik=kAi
自然语言:iii 必须是 kkk子集才能转移。
考虑两个变换后的多项式逐项系数相乘
FWT⁡or(A)∗FWT⁡or(B)=∑k(∑i∣k=kai)×(∑j∣k=kbj)\operatorname{FWT}_{or}(A)*\operatorname{FWT}_{or}(B)=\sum_{k}(\sum_{i|k=k}a_i)\times (\sum_{j|k=k}b_j)FWTor(A)FWTor(B)=k(ik=kai)×(jk=kbj)
=∑k∑i∣k=k∑j∣k=kaibj=∑k∑(i∣j)∣k=kaibj=FWT⁡or(C)=\sum_{k}\sum_{i|k=k}\sum_{j|k=k}a_ib_j=\sum_{k}\sum_{(i|j)|k=k}a_ib_j=\operatorname{FWT}_{or}(C)=kik=kjk=kaibj=k(ij)k=kaibj=FWTor(C)
所以我们就证出了系数直接相乘是对的,现在只需要一种快速的变换得到 FWT⁡or\operatorname{FWT}_{or}FWTor 以及将其反演的方法。

变换:

还是和FFT类似的,考虑分治,假设我们要合并两个长度为 2n2^n2n 的序列,设它们不同的最高位为1的序列为 A1A_1A1,为0的为 A0A_0A0
考虑 or的性质,A0A_0A0 可以转移到 A1A_1A1,而 A1A_1A1 无法转移到 A0A_0A0,因此有:
FWT⁡or(A)=(FWT⁡or(A0),FWT⁡or(A0)+FWT⁡or(A1))\operatorname{FWT}_{or}(A)=(\operatorname{FWT}_{or}(A_0),\operatorname{FWT}_{or}(A_0)+\operatorname{FWT}_{or}(A_1))FWTor(A)=(FWTor(A0),FWTor(A0)+FWTor(A1))
其中 +++ 表示系数逐项相加(f(x),g(x))(f(x),g(x))(f(x),g(x)) 表示把 f(x)f(x)f(x)g(x)g(x)g(x) 顺次写出。

逆变换

那么对应的,还原成原序列只需要逆向操作即可:
UFWT⁡or(A)=(UFWT⁡or(A0),UFWT⁡or(A0)−UFWT⁡or(A1))\operatorname{UFWT}_{or}(A)=(\operatorname{UFWT}_{or}(A_0),\operatorname{UFWT}_{or}(A_0)-\operatorname{UFWT}_{or}(A_1))UFWTor(A)=(UFWTor(A0),UFWTor(A0)UFWTor(A1))

代码

写起来非常简洁:

void Or(ll *x,int n,int op){for(int l=1;l<n;l<<=1){for(int st=0;st<n;st+=l*2){for(int i=0;i<l;i++){ll u=x[st+i],v=x[st+l+i];if(op==1) x[st+i]=u,x[st+l+i]=(v+u)%mod;else x[st+i]=u,x[st+l+i]=(v+mod-u)%mod;}}}
}

AND

or 的整个定义、证明几乎都是一样的。
求:ck=∑i&⁡j=kaibjc_k=\sum_{i\operatorname{\&}j=k}a_ib_jck=i&j=kaibj
与运算有如下性质:若 i&k=k,j&k=ki\&k=k,j\&k=ki&k=k,j&k=k,那么 (i&j)&k=k(i\&j)\&k=k(i&j)&k=k,反之亦然。
按照这个充要条件设计变换:FWT⁡or(A)k=∑i∣k=kAi\operatorname{FWT}_{or}(A)_k=\sum_{i|k=k}A_iFWTor(A)k=ik=kAi
自然语言:iii 必须是 kkk超集才能转移。
后面的证明一模一样,变换也可以同理的得到:
FWT⁡and(A)=(FWT⁡and(A0)+FWT⁡and(A1),FWT⁡and(A1))\operatorname{FWT}_{and}(A)=(\operatorname{FWT}_{and}(A_0)+\operatorname{FWT}_{and}(A_1),\operatorname{FWT}_{and}(A_1))FWTand(A)=(FWTand(A0)+FWTand(A1),FWTand(A1))
UFWT⁡and(A)=(UFWT⁡and(A0)−UFWT⁡and(A1),UFWT⁡and(A1))\operatorname{UFWT}_{and}(A)=(\operatorname{UFWT}_{and}(A_0)-\operatorname{UFWT}_{and}(A_1),\operatorname{UFWT}_{and}(A_1))UFWTand(A)=(UFWTand(A0)UFWTand(A1),UFWTand(A1))

代码

void And(ll *x,int n,int op){for(int l=1;l<n;l<<=1){for(int st=0;st<n;st+=l*2){for(int i=0;i<l;i++){ll u=x[st+i],v=x[st+l+i];if(op==1) x[st+i]=(u+v)%mod,x[st+l+i]=v;else x[st+i]=(u+mod-v)%mod,x[st+l+i]=v;}}}
}

XOR

这个和之前的有所不同。

定义

求:ck=∑i⊕⁡j=kaibjc_k=\sum_{i\operatorname{\oplus}j=k}a_ib_jck=ij=kaibj
d(x)d(x)d(x) 为二进制下 xxx 的1的个数的奇偶性(模2的结果)。
有性质:d(i&k)⊕d(j&k)=d((i⊕j)&k)d(i\& k)\oplus d(j\& k)=d((i\oplus j)\& k)d(i&k)d(j&k)=d((ij)&k)
证明:
由于与运算,只考虑 kkk 为1的那些位。如果某一位 i,ji,ji,j 都是1或0,那么等号两边的奇偶性都不改变;如果某一位 i,ji,ji,j 一个是1一个是0,那么等号两边的奇偶性都改变;所以等号两遍的奇偶性始终同步改变,最后就一定是相等的。

设计:
FWT⁡xor(A)k=∑i(−1)d(i&k)ai\operatorname{FWT}_{xor}(A)_k=\sum_{i} (-1)^{d(i\& k)}a_iFWTxor(A)k=i(1)d(i&k)ai
那么还是尝试逐项相乘:
FWT⁡xor(A)∗FWT⁡xor(B)=∑k(∑i(−1)d(i&k)ai)×(∑j(−1)d(j&k)bj)\operatorname{FWT}_{xor}(A)*\operatorname{FWT}_{xor}(B)=\sum_k(\sum_{i} (-1)^{d(i\& k)}a_i)\times (\sum_{j} (-1)^{d(j\& k)}b_j)FWTxor(A)FWTxor(B)=k(i(1)d(i&k)ai)×(j(1)d(j&k)bj)
=∑k∑i,j(−1)d(i&k)+d(j&k)aibj=∑k∑i,j(−1)d(i&k)⊕d(j&k)aibj=\sum_k\sum_{i,j} (-1)^{d(i\& k)+d(j\& k)}a_ib_j=\sum_k\sum_{i,j} (-1)^{d(i\& k)\oplus d(j\& k)}a_ib_j=ki,j(1)d(i&k)+d(j&k)aibj=ki,j(1)d(i&k)d(j&k)aibj
=∑k∑i,j(−1)d((i⊕j)&k)aibj=FWT⁡xor(C)=\sum_k\sum_{i,j} (-1)^{d((i\oplus j)\& k)}a_ib_j=\operatorname{FWT}_{xor}(C)=ki,j(1)d((ij)&k)aibj=FWTxor(C)
得证。

变换

还是分治的思想,考虑到增加一位后,只有下标最高位带1的数贡献到了下标最高位带1的位置时,最高位与运算结果为1,1的个数增加一个,奇偶性改变,所有的符号都变为相反。其它的转移都不变。
也就是:
FWT⁡xor(A)=(FWT⁡xor(A0)+FWT⁡xor(A1),FWT⁡xor(A0)−FWT⁡xor(A1))\operatorname{FWT}_{xor}(A)=(\operatorname{FWT}_{xor}(A_0)+\operatorname{FWT}_{xor}(A_1),\operatorname{FWT}_{xor}(A_0)-\operatorname{FWT}_{xor}(A_1))FWTxor(A)=(FWTxor(A0)+FWTxor(A1),FWTxor(A0)FWTxor(A1))

逆变换

反过来即可。
FWT⁡xor(A)=(FWT⁡xor(A0)+FWT⁡xor(A1)2,FWT⁡xor(A0)−FWT⁡xor(A1)2)\operatorname{FWT}_{xor}(A)=(\frac{\operatorname{FWT}_{xor}(A_0)+\operatorname{FWT}_{xor}(A_1)}{2},\frac{\operatorname{FWT}_{xor}(A_0)-\operatorname{FWT}_{xor}(A_1)}{2})FWTxor(A)=(2FWTxor(A0)+FWTxor(A1),2FWTxor(A0)FWTxor(A1))

代码

void Xor(ll *x,int n,int op){for(int l=1;l<n;l<<=1){for(int st=0;st<n;st+=l*2){for(int i=0;i<l;i++){ll u=x[st+i],v=x[st+l+i];if(op==1) x[st+i]=(u+v)%mod,x[st+l+i]=(u+mod-v)%mod;else x[st+i]=(u+v)%mod*499122177%mod,x[st+l+i]=(u+mod-v)%mod*499122177%mod;}}}
}

Thanks for reading!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[AtCoder Beginner Contest 216] 题解

文章目录A - Signed DifficultyB - Same NameC - Many BallsD - Pair of BallsE - Amusement ParkF - Max Sum CountingG - 01Sequence比赛链接A - Signed Difficulty 签到题 #include <cstdio> int x, y; char c; int main() {scanf( "%d%c%d", &x, &am…

长沙.NET技术社区正式成立

感谢大家的关注&#xff0c;请允许我冒昧的向大家汇报长沙.NET技术社区第一次交流会的会议进展情况。活动过程汇报2019年2月17日&#xff0c;继深圳&#xff0c;广州&#xff0c;西安&#xff0c;成都&#xff0c;苏州相继成立了.net社区之后&#xff0c;酝酿已久的长沙.net社区…

A Hard Problem

A Hard Problem 题意&#xff1a; 给定一个n&#xff0c;要求找到最小的正数k&#xff0c;使得在集合T中任意选K个数&#xff0c;其中存在两个不同的u和v&#xff0c;u是v的因子 题解&#xff1a; 一开始想偏了&#xff0c;往质因数方向想了&#xff0c;然后因为1e9的以内的…

hdu7207-Find different【burnside引理】

正题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid7207 题目大意 一个序列aaa&#xff0c;和它相同的序列当且仅当能通过以下操作实现相同&#xff1a; 将a1a_1a1​丢到ana_nan​&#xff0c;其余的向前移动一位。令所有ai(ai1)%ma_i(a_i1)\%mai​(ai​1)%m 对于n…

洛谷P6097:【模板】子集卷积(FWT)

解析 完全可以当一道 DP 题而不是模板来做。 首先第一个条件&#xff1a; i∣jki|jki∣jk 比较简单&#xff0c;直接上FWT板子即可。 考虑第二个条件&#xff1a;i&j0i\&j0i&j0。若设 ∣x∣|x|∣x∣ 表示二进制下 1 的个数&#xff0c;那么就有&#xff1a; ∣i∣…

Asp.NetCore轻松学-部署到 IIS 进行托管

前言经过一段时间的学习&#xff0c;终于来到了部署服务这个环节&#xff0c;.NetCore 的部署方式非常的灵活多样&#xff0c;但是其万变不离其宗&#xff0c;所有的 Asp.NetCore 程序都基于端口的侦听&#xff0c;在部署的时候仅需要配置侦听地址、端口&#xff08;一个或者多…

线段树/扫描线问卷调查反馈——Rmq Problem / mex(主席树),Boring Queries(二分+st表+主席树),Colorful Squares(扫描线)

文章目录Rmq Problem / mexBoring QueriesColorful SquaresRmq Problem / mex luogu4137 对aia_iai​建权值线段树 再加上可持久化 对于第RRR个版本的线段树&#xff0c;每个叶子xxx存的是aixa_ixai​x的所有iii中最大的小于RRR的位置iii 那么询问[L,R][L,R][L,R]就转化成…

C - Digital Path 计蒜客 - 42397 05-29

C - Digital Path 计蒜客 - 42397 题意&#xff1a; 题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走&#xff0c;而且下一个位置必须比当前位置的数字大1&#xff0c;入口和出口必须数边缘元素&#xff0c;求可以有多少条路径。 题解&#xff1a; 第一反…

响应式编程知多少 | Rx.NET 了解下

1. 引言An API for asynchronous programming with observable streams. ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming.ReactiveX 使用可观察数据流进行异步编程的API。 ReactiveX结合了观察者…

数据结构之trie树——First! G,电子字典,Type Printer,Nikitosh and xor

文章目录[USACO12DEC]First! G[JSOI2009]电子字典[IOI2008] Type PrinterNikitosh and xor[USACO12DEC]First! G luogu3065 考虑每一个字符串成为答案的可能 这意味着从字典树根到字符串最后一位就恰好对应重新定义的字典序 在第iii层的时候&#xff0c;想要走特定点&#…

H - Prince and Princess 计蒜客 - 42402

H - Prince and Princess 计蒜客 - 42402 题意: 你现在要寻找公主&#xff0c;有三种人&#xff0c;第一种是说真话的人(至少为1&#xff0c;因为公主是说真话的人)&#xff0c;第二种人是只会说假话的&#xff0c;第三种是胡说八道的(说的话真假都有可能)。现在给你三种人的…

模板:min-max容斥离散随机变量的几何分布(洛谷P3175:[HAOI2015]按位或)

前言 见到一道神题&#xff0c;学会两个知识点… 都是数学。 min-max容斥 给出式子&#xff1a; max⁡(S)∑T⊂S(−1)∣T∣1min⁡(T)\max(S)\sum_{T\sub S}(-1)^{|T|1}\min(T)max(S)T⊂S∑​(−1)∣T∣1min(T) min⁡(S)∑T⊂S(−1)∣T∣1max⁡(T)\min(S)\sum_{T\sub S}(-1)^…

杭电多校杂题收录

前言 和学长学弟一起打的hdu多校&#xff0c;打的很菜没啥难题收录&#xff0c;因为难的我都不会做。 正题 hdu7152-Copy 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid7152 题目大意 nnn个数字的序列aaa&#xff0c;mmm次操作&#xff0c;每次将一段[l,r][l,r][l,r…

.NET Core中的验证组件FluentValidation的实战分享

今天有人问我能不能出一篇FluentValidation的教程&#xff0c;刚好今天在实现我们的.NET Core实战项目之CMS的修改密码部分的功能中有用到FluentValidation&#xff0c;所以就以修改用户密码为实例来为大家进行一下ASP.NET Core中的验证组件FluentValidation的实战分享&#xf…

笛卡尔树详解带建树模板及例题运用(Largest Submatrix of All 1’s,洗车 Myjnie,Removing Blocks,SPOJ PERIODNI)

文章目录笛卡尔树介绍例题Largest Submatrix of All 1’s应用「POI2015」洗车 Myjnie[AGC028B] Removing BlocksSPOJ PERIODNI笛卡尔树 介绍 笛卡尔树是一种数据结构&#xff0c;每个点由两个值&#xff0c;键值key和权值val&#xff0c;组成 其键值满足二叉树性质 即点的左子…

K - Triangle 计蒜客 - 42405

K - Triangle 计蒜客 - 42405 题意&#xff1a; 给你一个三角形的三点&#xff0c;再给你三角形边上一个点&#xff0c;让你求另一个点(也要在三角形上)&#xff0c;使得平分三角形的面积 题解: 计算几何 三角形的三边ab&#xff0c;ac&#xff0c;bc 如果点p在ab上&#x…

P2508-[HAOI2008]圆上的整点【数学】

正题 题目链接:https://www.luogu.com.cn/problem/P2508 题目大意 一个在(0,0)(0,0)(0,0)的圆心&#xff0c;半径为rrr&#xff0c;求圆有多少个整点。 1≤r≤21091\leq r\leq 2\times 10^91≤r≤2109 解题思路 设这个点为(x,y)(x,y)(x,y)&#xff0c;那么有x2y2r2x^2y^2r^2…

如何为ASP.NET Core设置客户端IP白名单验证

本篇博文中展示了如何在ASP.NET Core应用程序中设置IP白名单验证的3种方式。你可以使用一下3种方式&#xff1a;使用中间件检查每个请求的远程IP地址使用Action过滤器为指定的Controller或action方法添加针对远程IP地址的检查使用IPageFilter为Razor Pages应用添加针对远程IP地…

CodeForces - 140C New Year Snowmen

CodeForces - 140C New Year Snowmen 题意&#xff1a; 现在来做雪人&#xff0c;每个雪人由三个不同大小的雪球构成&#xff1a;一个大的&#xff0c;一个中等的&#xff0c;一个小的。现在有 n 个雪球半径分别为 r1, r2, …, rn. 为了做雪人&#xff0c;三个雪球的大小必须…

洛谷P4389:付公主的背包(多项式、生成函数)

对于一些生成函数累乘的题目&#xff0c;也许可以通过求 ln⁡\lnln 转化为累加问题从而完成简化。 解析 不难写出对于单个物品 kkk 的生成函数&#xff1a; ∑i1xVi11−xVK\sum_{i1}x^{Vi}\frac{1}{1-x^{V_K}}i1∑​xVi1−xVK​1​ 那么答案的生成函数就是所有物品的函数的卷积…