学习笔记多项式全家桶(包含全套证明)
Posted 繁凡さん
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记多项式全家桶(包含全套证明)相关的知识,希望对你有一定的参考价值。
整理的算法模板合集: ACM模板
实际上是一个全新的精炼模板整合计划
多项式全家桶!!!
目录
- 0x00.多项式基本概述
- 0x10.多项式插值
- 0x20.多项式乘法
- 0x30.多项式求逆
- 0x40.多项式开方
- 0x50.多项式除法 / 取模
- 0x60.多项式牛顿迭代
- 0x70.多项式多点求值 / 快速插值
- 0x80.多项式三角函数
- 0x90.多项式反三角函数
- 0x100.常系数齐次线性递推(多项式优化)
- 0x110.快速差分/前缀和
- 0x120.多项式对数(多项式求导 + 积分)
- 0x130.多项式指数(大毒瘤 )
- 0x140.多项式快速幂
- 0x150.多项式全家桶!!!(code)
tips:
注意一点,在我们每次求
limit
的时候,把范围都乘2
,反正乘了开大一点不会错,最多会跑的慢一点,但是有时候不开就会WA
(比如在求多项式除法的时候)
limit
可以设成全局变量,注意每次使用limit
的时候都要按照下面的格式初始化一下limit
以及L
就是这里:for(limit = 1, L = 0; limit <= (n + m) * 2; limit <<= 1) L ++ ; for(int i = 0; i < limit; ++ i) RR[i] = (RR[i >> 1] >> 1) | ((i & 1) << (L - 1));
0x00.多项式基本概述
既然是多项式全家桶,那么肯定要先来了解一下什么是多项式hhh,基础一定要扎实,不然到后面让你怀疑人生
0x01. 多项式的基础概念
首先是多项式的一些基础的概念:
0x02. 多项式的度
对于一个多项式 f ( x ) f(x) f(x),称其最高次项的次数为该多项式的 度(Degree) ,记作 d e g f deg\\ f deg f。
好吧就是多项式的次数。(顺带一提,单项式的次数是所有字母次数之和hhh)
0x03. 多项式的乘法
我们上面也说了多项式 × \\times × 多项式 = = = 新的多项式。
所以我们最关心的操作就是两个多项式的乘法 —— 卷积。
广义上的卷积为:
h ( x ) = ∫ − ∞ ∞ g ( τ ) ⋅ f ( x − τ ) d τ h(x) = \\int _- \\infty ^\\inftyg(\\tau) \\cdot f(x - \\tau) \\rmd\\tau h(x)=∫−∞∞g(τ)⋅f(x−τ)dτ
我们这里仅讨论多项式域,即两个多项式 / 数组 / 序列的卷积。
即给定两个多项式 f ( x ) f(x) f(x), g ( x ) g(x) g(x) :
f ( x ) = a 0 + a 1 x + ⋯ + a n x n f(x)= a_0 + a_1x+ \\dots +a_nx^n f(x)=a0+a1x+⋯+anxn
g ( x ) = b 0 + b 1 x + ⋯ + b m x m g(x)= b_0 + b_1x+ \\dots +b_mx^m g(x)=b0+b1x+⋯+bmxm
计算多项式 Q ( x ) = f ( x ) ⋅ g ( x ) : Q(x) = f(x)\\ ·\\ g(x): Q(x)=f(x) ⋅ g(x):
Q ( x ) = ∑ i = 0 n ∑ j = 0 m a i b j x i + j = c 0 + c 1 x + ⋯ + c n + m x n + m \\boxed Q(x) = \\sum \\limits_ i = 0 ^ n \\sum \\limits_ j = 0 ^ m a_i b_j x ^ i + j = c_0 + c_1 x + \\dots + c_ n + m x ^ n + m Q(x)=i=0∑nj=0∑maibjxi+j=c0+c1x+⋯+cn+mxn+m
C ( x ) = A ( x ) ∗ B ( x ) = ∑ i = 0 n ( ∑ j = 0 i a j b i − j ) x j + i − j = ∑ i = 0 n ( ∑ j = 0 i a j b i − j ) x i C(x)=A(x)*B(x)=\\sum_i = 0^n(\\sum_j=0^ia_j b_i-j)x^j+i-j=\\sum_i = 0^n(\\sum_j=0^ia_j b_i-j)x^i C(x)=A(x)∗B(x)=i=0∑n(j=0∑iajbi−j)xj+i−j=i=0∑n(j=0∑iajbi−j)xi
也就是对于 C ( x ) C(x) C(x) 的第 i i i 项的系数:
[ i ] C ( x ) = ∑ j = 0 i a j b i − j [i]C(x)=\\sum_j=0^ia_j b_i-j [i]C(x)=j=0∑iajbi−j
C ( x ) = A ( x ) ∗ B ( x ) = ∑ k = 0 n + m − 2 ( ∑ k = i + j a i b j ) x k C(x)=A(x)* B(x)=\\sum_k=0^n+m-2(\\sum_k=i+ja_ib_j)x^k C(x)=A(x)∗B(x)=k=0∑n+m−2(k=i+j∑aibj)xk
这里使用的就是上面介绍的系数表示,我们如果直接暴力相乘很明显是一个 O ( n m ) O(nm) O(nm) 的复杂度,因为我们每一项都需要相乘。但是我们可以通过快速傅里叶变换将常用的系数表示转为点值表示用 O ( n l o g n ) O(nlogn) O(nlogn) 的时间复杂度下计算得到答案,再逆变换转成系数表示输出,将会在下面章节介绍。
0x04. 多项式的逆元
对于
n
n
n 次多项式
f
(
x
)
f(x)
f(x),若存在
g
(
x
)
g(x)
g(x),满足: 以上是关于学习笔记多项式全家桶(包含全套证明)的主要内容,如果未能解决你的问题,请参考以下文章
f
(
x
)
g
(
x
)
≡
1
(
m
o
d
x
n
)