关于多项式的一些东西

泰勒展开

设\(f(x)\)在\(x_0\)处可导,且存在无穷阶导数,那么根据泰勒展开,有:
\[f(x) = \sum_{i=0}^{\inf} \frac{f^{[i]}(x_0)}{i!}(x-x_0)^i + \delta\]
其中\(\delta\)是一个余项,表示一个趋近于无穷小的误差。每展开一项,误差就越小。
若\(f(x)\)在\(x_0 = 0\)处可导,带入泰勒展开式后可以得到\(f(x)\)的麦克劳林展开式:
\[f(x) = \sum_{i=0}^{\inf} \frac{f^{[i]}(0)}{i!}x^i + \delta\]
一般来说,信息学奥赛中都会使用麦克劳林展开式。我们可以将\(e^x\)用麦克劳林展开:
\[e^x = 1 + \frac{x}{1!} + \frac{x^2}{2!} + ... + \delta = \sum_{i=0}^{\inf} \frac{x^i}{i!} + \delta\]
这个式子将在后面反复用到,是非常重要的式子。

牛顿迭代法

给定一个关于\(B(x)\)的函数\(F\),求\(F(B(x)) = 0(mod\ x^t)\)。
我们令\(B_t(x)\)表示模\(x^{2^{t}}\)意义下的一个解。
那么,对\(F(B_{t+1}(x))\)在\(B_{t}(x)\)处进行泰勒展开有:
\[F(B_{t+1}(x)) = F(B_t(x)) + \frac{F'(B_t(x))}{1!} (B_{t+1}(x) - B_t(x)).....\]
又\(deg(B_{t+1}(x) - B_t(x))^2 = 2^{t+2}-1\geq 2^{t+1}\)。
所以除了最前面的两项,其他项的结果都为\(0\)。
所以
\[F(B_{t+1}(x)) = F(B_t(x)) + \frac{F'(B_t(x))}{1!} (B_{t+1}(x) - B_t(x))\]
化简可得:
\[B_{t+1}(x) = B_{t}(x) - \frac{F(B_t(x))}{F'(B_t(x))}\]

利用牛顿迭代,我们就能够解决多项式的各种基本运算了。

多项式基本运算

乘法就不说了,\(FFT\)、\(NTT\)、\(MTT\)、分治\(FFT\)等 都是基本功。

多项式求导与积分

  • 求导\((c(x^a))' =cax^{a-1}\)
  • 积分\(\int cx^a = \frac{cx^{a+1}}{a+1}\)

求导后,默认最高项等于\(0\)。积分后,默认最低项等于\(0\)。

多项式求逆

牛顿迭代得出的运算重点推导这一个,剩下的全部以给公式的形式呈现。
\(A_t(x)B_{t-1}(x) = 1\ \ \ \ \to \ \ \ \ A_t(x)B_{t-1}(x) - 1 = 0\)
然后套牛顿迭代就行了:
\[B_{t}(x) = B_{t-1}(x) - \frac{A_t(x)B_{t-1}(x) - 1}{A_t(x)} = 2B_{t-1}(x) - A_t(x)B_{t-1}^2(x)\]
多项式\(A(x)\)存在逆的条件:常数项\(\neq 0\)。
注意一下,由于\(B_t(x)\)、\(A_t(x)\)的第\(2^{t}\)项是没有值的,所以传参\(len\)时可以减少一倍。

多项式求\(ln\)

不需要牛顿迭代推出的运算重点推导这一个,剩下的全部以给公式的形式呈现。
\(lnA(x) = B(x) \ \ \ \ \to \ \ \ \ B'(x) = \frac{A'(x)}{A(x)}\)。
然后好像就没了......求逆后积分回去就行了。

其余多项式运算

全部给公式了,推导都是一样的。

  • 快速幂:\(B(x) = e^{K ln(A(x))}\)
  • 开根:\(B_t(x) = \frac{1}{2}(B_{t-1}(x) + \frac{A_t(x)}{B_{t-1}(x)})\)
  • 求\(exp\):\(B_t(x) = B_{t-1}(x)(1 - ln(B_{t-1}(x)) + A_t(x))\)

注意一下,求\(ln\)前常数项必须为\(1\),求\(exp\)前常数项必须为\(0\)。

多项式乘法在串匹配中的应用

特征:字符集极小或存在通配符
建模技巧:

  • 允许存在不超过\(K\)的偏移量:直接将当前枚举字符向左右扩展\(K\)格(差分实现)。
  • 存在通配符:令通配符\(S_i = T_j = 0\),
    则把匹配条件变为\(0 = \sum_{i=1}^{|T|} (S_{i+st} - T_i)T_iS_{i+st}\),拆式子后\(FFT\)。

匹配方法:

  • 常规匹配:形如\(i_S - j_T = c\),反向\(FFT\)/\(NTT\)处理
  • 对称匹配:形如\(i_S + j_S = 2 * k_T\),正向\(FFT\)/\(NTT\)处理。

这类题目只要认真分析+胡思乱想总能想出来的,关键还是在于对字符串的理解。

生成函数简介

生成函数就是母函数。
母函数可以推导递推公式的通项公式,但是那一套就不说了,跟多项式关系也不大。
生成函数有两种,普通型\(G(x) = \sum_{i=0}^{\inf} g_i x^i\)与指数型\(F(x) = \sum_{i=0}^{\inf} f_i \frac{x^i}{i!}\)。
一般来说,有序问题会使用指数型,而组合问题会使用普通型。
普通型没啥好说的吧......
指数型母函数就是\(e^x\)的展开式,故可以有一些骚套路:

  • \(e^{-x} = 1 - \frac{x}{1!} + \frac{x^2}{2!} - \frac{x^3}{3!}......\)
  • 只要奇数项:\(\frac{e^x - e^{-x}}{2}\)
  • 只要偶数项:\(\frac{e^x + e^{-x}}{2}\)
  • \(e^{nx} = 1 + \frac{(nx)}{1!} + \frac{(nx)^2}{2!} + \frac{(nx)^3}{3!}......\)

指数型母函数的系数本质就是多了一个可重排列\(\frac{(\sum_{i=1}^ma_i)!}{a_1!a_2!...a_m!}\)。
我们使用泰勒展开还可以得到广义二项式定理:

  • $(1+x)^m = 1 + \frac{m}{1!} x + \frac{m(m-1)}{2!}x^2 + ... + \frac{m(m-1)...2*1}{m!} x^m $
  • \((1-x)^m = 1 - \frac{m}{1!} x + \frac{m(m-1)}{2!} x^2 - \frac{m(m-1)(m-2)}{3!}x^3 + ... \frac{m(m-1)...2*1}{m} x^m\)
  • \((1+x)^m = \binom{m}{m} + \binom{m}{m-1}x + \binom{m}{m-2}x^2 +... \binom{m}{0} x^m\)
  • \((1-x)^m = \binom{m}{m} - \binom{m}{m-1}x + \binom{m}{m-2}x^2 + ... \binom{m}{0} x^m\)

这玩意儿在手算题里有奇效,得到形如\(\frac{1}{(1-x)^k}\)的生成函数后,可以通过这个直接得到第\(r\)项系数。
最后:
关于选择、组合问题请多想生成函数!!!
关于选择、组合问题请多想生成函数!!!
关于选择、组合问题请多想生成函数!!!

若干有用的科技/套路

简单(单项)多项式手动求\(ln\)

当出现求\(ln F(x)\),其中\(F(x)\)只包含一个形如\(x^t\)的项时,可以考虑手动求\(ln\)。
手动求\(ln\)的方法为:先求导,然后把分母展开为生成函数,最后积分得到答案。
给一个例子:\(F(x) = ln (1-x^t)\)。
\[F(x) = \int F'(x) = \int \frac{-tx^{t-1}}{1-x^t} = \int -tx^{t-1} \sum_{i=0}^{\inf} x^{ti}\]
继续:
\[F(x) = -\int \sum_{i=0}^{\inf} tx^{t(i+1)-1} = -\sum_{i=1}^{\inf}\frac{tx^{ti}}{ti} = -\sum_{i=1}^{\inf} \frac{x^{ti}}{i}\]
这个技巧可谓是相当相当相当的关键了,下面的一些推导中,还会反复使用到这个技巧。

组合关系的生成函数拆分

给定一个形如\(h_x = \sum_{i=0}^{n} \binom{n}{i}f_ig_{n-i}\)
若\(h_i\)、\(g_i\)好求,需要求\(f_i\),那么我们可以把组合数拆开后这么做:
\[\frac{h_n}{n!} = \sum_{i=0}^n \frac{f_i}{i!} \frac{g_{n-i}}{(n-i)!}\]
接着构造生成函数\(H(x) =\sum_{i=0}^{\inf} \frac{h_i}{i!}x^i\)、\(F(x)=\sum_{i=0}^{\inf} \frac{f_i}{i!}x^i\)、\(G(x)=\sum_{i=0}^{\inf} \frac{g_i}{i!}x^i\)。
那么有\(H(x) = F(x)G(x)\)。
所以\(F(x) = \frac{H(x)}{G(x)}\),通过多项式求逆得到\(F(x)\)后即可得到\(f_i\)。

划分关系与指数型生成函数

设\(F(x) = \sum_{i=1}^n f_i \frac{x^i}{i!}\),其中\(f_i\)表示\(i\)个元素的\(A\)集合的种类数。
同理我们设\(G(x) = \sum_{i=0}^n g_i \frac{x^i}{i!}\),其中\(g_i\)表示\(i\)个元素的\(B\)集合的种类数。
若所有元素都有编号,且\(B\)集合是由若干\(A\)集合构成的,那么有:
\[G(x) = e^{F(x)}\]
几个例子:

  • 设\(F(x)\)为简单有向联通图的生成函数,\(G(x)\)为简单有向图的生成函数。
  • 设\(F(x)\)为要求联通的\(DAG\)的生成函数,\(G(x)\)为不要求联通的\(DAG\)的生成函数。

证明:把\(e^{F(x)}\)泰勒展开后有:\(e^{F(x)} = \sum_{i=0}^n \frac{F(x)^i}{i!}\) 。
然后我们考虑\(G(x)\)中的每一项的构成:
\[[x^n]G(x) = x^n\sum_{k=1}^n \frac{[x^n](F(x)^k)}{k!} = x^n\sum_{k=1}^n [\frac{\frac{f_{a_1}f_{a_2}...f_{a_k}}{a_1!a_2!...a_k!}}{k!}] = \frac{x^n}{n!} \sum_{k=1}^n [(\frac{f_{a_1}f_{a_2}...f_{a_k}}{a_1!a_2!...a_k!})\frac{n!}{k!}]\]
可以注意到\(\frac{n!}{a_1!a_2!...a_k!}\)正是可重排列编号的方案数,而\(\frac{1}{k!}\)对应构成\(B\)的\(A\)集合之间无顺序关系。

快速求\(R(x) = \prod_i^m (1-x^{t_i})\ \ (mod\ x^{n})\)

一般的背包问题其实就是若干\(T(x) = \frac{1}{1-x^{V_i}}\)卷起来,所以这个东西可以解决背包问题。
显然不能直接分治\(NTT\),但我们可以在\(O(nln(n)+nlog^2n)\)的时间内求出这个式子。
先求\(G(x) = \prod_i^m \frac{1}{(1-x^{t_i})}\),设\(F_i(x) = \frac{1}{(1-x^{t_i})}\),那么
\[G(x) = e^{\sum_{i=1}^m ln(F_{i}(x))}\]

最后再对\(G(x)\)求逆即可得到答案。
考虑求\(Ans(x) = \sum_{i=1}^m ln(F_i(x))\),显然不能对每一项直接求\(ln\)。
我们尝试两边求导得:\(Ans = \int \sum_{i=1}^m (ln(F_{i}(x)))'\)。然后化简\((ln(F_i(x)))'\)有:
\[(lnF_i(x))' = \frac{F_i'(x)}{F_i(x)} = (1-x^{t_i})(\sum_{j=0} x^{jt_i})' = (1-x^{t_i})(\sum_{j=1} t_jjx^{jt_i-1})\]

把上式错位相减后有:\((lnF_i(x))' =\sum_{j = 1} t_i x^{jt_i - 1}\),所以有:
\[Ans(x) = \int \sum_{i=1}^m(lnF_i(x))' = \sum_{i=1}^m \int \sum_{j=1} t_ix^{jt_i-1} = \sum_{i=1}^m \sum_{j=1} \frac{x^{jt_i}}{j}\]

于是乎,首先统计每种\(t\)的数量\(cnt_{t}\),然后暴力给\(Ans(x)\)加贡献即可,复杂度调和级数。

快速求\(\sum_{i=1}^n a_i^k , k\in[1,t]\)

\(O(nk)\)显然是假的,这辈子都不可能这么简单的。
构造\(F(x) = \prod_{i=1}^n (a_ix + 1)\)
那么\(lnF(x) = \sum_{i=1}^n ln(a_ix+1)\),考虑手动求\(ln\):
\[ln(a_ix+1) = \int \frac{a_i}{1+a_ix} = a_i \int \sum_{j=0}^{\inf}(-a_i)^j x^j = \sum_{j=1}^{\inf}\frac{(-1)^{j-1}}{j}a_i^jx^j\]
所以\(lnF(x) = \sum_{i=1}^n \sum_{j=1}^{\inf} \frac{(-1)^{j-1}}{j}a_i^j x^j = \sum_{j=1}^{\inf}\frac{(-1)^{j-1}}{j} \sum_{i=1}^n a_i^j x^j\)。
而\(F(x)\)可以同过分治\(FFT\)求出,所以求出\(F(x)\)后,对\(F(x)\)求\(ln\)得到每一项的系数即可。

快速求\(\sum_{i=1}^n \sum_{j=1}^m (a_i + b_j)^k , k\in [1,t]\)

把式子暴力化开:\(f(x) = \sum_{i=1}^n \sum_{j=1}^m (a_i + b_j)^x = \sum_{i=1}^n \sum_{j=1}^m \sum_{k=0}^x a_i^k b_j^{x-k} \binom{x}{k}\)
所以有:
\[f(x) = x!\sum_{k=0}^x \frac{\sum_{i=1}^n a_i^k}{k!} \frac{\sum_{j=1}^m b_j^{x-k}}{(x-k)!}\]
而我们已经会快速求\(\sum_{i=1}^n a_i^k\)了,所以只需要构造卷积再套一次\(FFT\)即可。

原文地址:https://www.cnblogs.com/GuessYCB/p/10126271.html

时间: 2024-11-24 21:42:11

关于多项式的一些东西的相关文章

多项式填坑。。?

多项式填坑..? 大概就是填填坑了. 多项式带余除法 这东西啥啊.怎么还带翻转的. 别指望我写推导,丢个代码块就跑. 而且还是我美妙无比的多项式模板.(牛顿迭代自己\(yy\)循环写法的真的就我一个吗?) inline void Inv(int *A,int *B,int n){ B[0]=Pow(A[0],MOD-2); for(RG int m=2;m<n<<1;m<<=1){ for(RG int i=0;i<m;++i) tmp[i]=B[i],B[i]=Plu

51nod 1258 序列求和 V4

跪烂(貌似我记得,是我要学习多项式的一些东西,然后发现可以搞伯努利数,然后就奇怪的入坑了) 这个题显然是不可以n^2来预处理伯努利数的 那怎么办呢........找题解啊... 这里有伯努利数的生成函数,(不知道怎么推的),然后搞一搞就成了一个多项式求逆的样子. 而且这个题还有一个BT的就是,1e9+7是不能写成1+2^k*n的形式的,所以就没有办法直接NTT,这里还要用到一个三模数NTT,就是取出3个满足1+2^k*n形式的大质数(先假设为a,b,c吧),满足a*b*c>n*P*P(P在这里就

FFT简明指南

简介 FFT是用来计算多项式卷积的东西. 多项式卷积: \(C=A\ast B\) ,即 \(c_k=\sum_{i+j=k} a_i\times b_j\) .(假设下标范围 \(0-n\) ) 直接按照定义做是 \(O(n^2)\) 的,但是FFT可以做到 \(nlog(n)\) . 一些奇奇怪怪的东西(定义) 考虑一个 \(n\) 次多项式,取 \(n\) 个不同的 \(x\) 代入会得到 \(n\) 个 \(y\) ,然后发现由于我们可以解方程,因此只要不是无解.多解,我们可以说,一个

2017 ACM-ICPC 西安网络赛 F.Trig Function Chebyshev多项式

自己太菜,数学基础太差,这场比赛做的很糟糕.本来想吐槽出题人怎么都出很数学的题,现在回过头来想还是因为自己太垃圾,竞赛就是要多了解点东西. 找$f(cos(x))=cos(nx)$中$x^m$的系数模998244353. wolfram alpha查了这个函数无果,得到了一堆sinx和cosx以及一个复指数的方程,其实应该推个几项再用数列查询查查看的,然后就会知道是Chebyshev polynomials 查WIKI直接就有通项公式了.然后就比较简单的了. 连方程都看不出来就别想着推导公式了.

为什么美国学生学的数学比我们简单却还能做出很牛逼的东西?

听说过这样一种说法:美国初中生学的数学是咱们国家小学生学的水平,美国高中生学的数学是咱们国家初中的水平.(不知道对不对) 那么,为什么很多需要数学的东西(比如计算机图形学领域)都是人家做出来的而不是咱们 ?算法对数学的要求够大了吧? PPS:一个类似的回答,有启发意义:美国高中教育那么粗浅,大学教育那么尖端,中间的 Gap 怎么搞定? 私以为 @倪大为 同学引用的答案说的是最正确的.特此赞同一下:"美国给予不热爱数学的学生最基础的数学教育,而给予热爱数学的天才最高水平的数学教育." 长久以来,中

[学习笔记] 多项式与快速傅里叶变换(FFT)基础

引入 可能有不少OIer都知道FFT这个神奇的算法, 通过一系列玄学的变化就可以在 $O(nlog(n))$ 的总时间复杂度内计算出两个向量的卷积(或者多项式乘法/高精度乘法), 而代码量却非常小. 博主一年半前曾经因COGS的一道叫做"神秘的常数 $\pi$"的题目而去学习过FFT, 但是基本就是照着板子打打完并不知道自己在写些什么鬼畜的东西OwO 不过...博主这几天突然照着算法导论自己看了一遍发现自己似乎突然意识到了什么OwO然后就打了一道板子题还1A了OwO再加上午考试差点AK

【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂

[BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列.但是小C有一个问题需要你的帮助:给定整数x,求所有可以生成出的,且满足数列中所有数的乘积mod M的值等于x的不同的数列的有多少个.小C认为,两个数列{Ai}和{Bi}不同,当且仅当至少存在一个整数i,满足Ai≠Bi.另外,小C认为这个问题的答案可能

组合数学漫游奇境记:Schur 多项式,Hook 长度公式,Macmahon 平面分拆公式

Young 表上的组合学是代数组合学中最奇妙的部分,与表示论,统计力学,概率论有着丰富而深刻的联系.这篇文章将从几个有趣的问题开始,带领大家走进这个美丽的领域.所需要的预备知识很少,学过线性代数即可,但是要真正领略其中风光,数学上的成熟是必不可少的. 需要事先剧透的是,本文要证明的几个定理绝非泛泛,它们都是代数组合学中的著名结论. 先来看几个问题: 有 $m$ 位总统候选人参加大选,他们每个人分别有 $\lambda_1,\ldots,\lambda_m$ 位支持者(假定选民只投票给他支持的候选

多项式求ln,求exp,开方,快速幂 学习总结

按理说Po姐姐三月份来讲课的时候我就应该学了 但是当时觉得比较难加上自己比较懒,所以就QAQ了 现在不得不重新弄一遍了 首先说多项式求ln 设G(x)=lnF(x) 我们两边求导可以得到G'(x)=F‘(x)/F(x) 则G(x)就是F’(x)/F(x)的积分 我们知道多项式求导和积分是O(n)的,多项式求逆是O(nlogn)的 所以总时间复杂度O(nlogn) 多项式求ln一般解决的问题是这样的 设多项式f表示一些奇怪的东西,由一些奇怪的东西有序组成的方案为 f^1+f^2+f^3…… 化简之