关于一类位运算多项式相乘的做法

题目大意

给定两个下标均为 [0..2n1] 的多项式 A,B ,数组 C=A×B ,满足
Ci=(j op k)=iAjBk

其中 op 可以为三种位运算符号 or,and,xor

题解

这种问题有一个经典的做法,Fast Walsh-Hadamard Transform,但很难记忆,下面是种比较好推的做法。三种符号分类讨论。

Or

设当前 A,B 长度为 2L A=a+bxL,B=c+dxL ,其实就是拆成两半。而且由于操作符是 Or ,所以可以直接通过 xL 实现左移 L 位。

那么AB=(a+bxL)(c+dxL)=ac+xL(bc+ad)+xLxLbd

因为是 Or ,所以 xLxL=xL ,因此 AB=ac+xL(bc+ad+bd)

那么我们可以先求出 (a+b)(c+d) 以及 ac ,然后用 O(L) 的时间就可以求出 AB 了。

时间复杂度 T(L)=2T(L2)+O(L)=O(LlogL)

Xor

设当前 A,B 长度为 2L A=a+bxL,B=c+dxL ,其实就是拆成两半。而且由于操作符是 Xor ,所以可以直接通过 xL 实现左移 L 位。

那么AB=(a+bxL)(c+dxL)=ac+xL(bc+ad)+xLxLbd

因为是 Xor ,所以 xLxL=x0=1 ,因此 AB=ac+xL(bc+ad)+bd

那么设 X=(a+b)(c+d),Y=(ab)(cd) ,可以惊奇的发现 bc+ad=XY2,ac+bd=X+Y2 。于是一样用 O(L) 的时间就可以求出了。

时间复杂度 T(L)=2T(L2)+O(L)=O(LlogL)

And

一样把 A,B 分为两半,但现在不能用 xL 来左移了,因为是 and

但是可以发现的是, AB 的左边只能由 bd 做出贡献,而且右边的贡献就是 bc+ad+ac

那么我们可以算出 (a+b)(c+d),bd ,然后拼接一下就好了。

时间复杂度 T(L)=2T(L2)+O(L)=O(LlogL)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值