概述

多项式开跟是一个非常重要的知识点,许多多项式题目都要用到这一算法。

用快速数论变换,多项式求逆元和倍增法可以在$O(n log n)$的时间复杂度下求出一个$n$次多项式的开根。

前置技能

快速数论变换(NTT),多项式求逆元,二次剩余。

多项式的开根

给定一个多项式$A(x)$,其次数为$deg_A$,若存在一个多项式$B(x)$,使其满足$deg_B≤deg_A$,且$ B^2(x) \equiv A(x) (mod\ x^n)$,则$B(x)$即为$A(x)$在模$x^n$意义下的的开根。

求多项式的开根

我们不妨假设,$n=2^k,k∈N$。

若$n=1$,则$b_0^2 \equiv a_0(mod\ x)$。其中$a_0$,$b_0$表示多项式$A$和多项式$B$的常数项。

若需要求出$b_0$,直接用二次剩余求出即可。(不过由于大部分题目公式特别优美,常数项通常为0)

当$n>1$时:

我们假设在模$x^{\frac{n}{2}}$的意义下$A(x)$的开根$B'(x)$我们已经求得。

依据定义,则有

$B^2(x)\equiv A(x) (mod\ x^{n})$          $(1)$

因为多项式$B'(x)$满足

$B'^2(x)\equiv A(x) (mod\ x^{\frac{n}{2}})$          $(2)$

将$(1)-(2)$,得

$B^2(x)-B'^2(x)\equiv 0(mod\ x^{\frac{n}{2}})$          $(3)$

我们用平方差公式将$(3)$展开

$(B(x)+B'(x))(B(x)-B'(x))\equiv 0(mod\ x^{\frac{n}{2}})$          $(4)$

然后我们会发现多项式$B(x)$有两个解,下面考虑其中一种情况

$B(x)-B'(x)\equiv 0(mod\ x^{\frac{n}{2}})$          $(5)$

我们将$(5)$式同余符号两边平方,得

$B^2(x)-2B(x)B'(x)+B'^2(x)\equiv 0(mod\ x^n)$          $(6)$

考虑到式$(1)$,我们将式$(1)$代入式$(6)$,得

$A(x)-2B(x)B'(x)+B'^2(x)\equiv 0(mod\ x^n)$          $(7)$

最后对式 $(7)$进行移项,得到

$B(x)\equiv \dfrac{A(x)+B'^2(x)}{2B'(x)} (mod\ x^n)$          $(8)$

显然,我们可以用上述式子,通过倍增,求出n次项的$B(x)$。

这一步的计算我们可以使用多项式求逆元和$NTT$,时间复杂度为$O(n log n)$。

我们可以通过递归的方法,求解出最终的$N$次项的$B(x)$

时间复杂度$T(n)=T(\dfrac{n}{2})+O(n log n)=O(n log n)$。

模板如下:(暂时还没有)

【learning】多项式开根详解+模板的更多相关文章

  1. 多项式求逆元详解+模板 【洛谷P4238】多项式求逆

    概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...

  2. BZOJ 3625 [Codeforces Round #250]小朋友和二叉树 ——NTT 多项式求逆 多项式开根

    生成函数又有奇妙的性质. $F(x)=C(x)*F(x)*F(x)+1$ 然后大力解方程,得到一个带根号的式子. 多项式开根有解只与常数项有关. 发现两个解只有一个是成立的. 然后多项式开根.求逆. ...

  3. P5277 【模板】多项式开根(加强版)(bsgs or Cipolla)

    题面 传送门 题解 首先你得会多项式开根->这里 其次你得会解形如 \[x^2\equiv a \pmod{p}\] 的方程 这里有两种方法,一个是\(bsgs\)(这里),还有一种是\(Cip ...

  4. FFT模板 生成函数 原根 多项式求逆 多项式开根

    FFT #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> ...

  5. 【XSY2730】Ball 多项式exp 多项式ln 多项式开根 常系数线性递推 DP

    题目大意 一行有\(n\)个球,现在将这些球分成\(k\) 组,每组可以有一个球或相邻两个球.一个球只能在至多一个组中(可以不在任何组中).求对于\(1\leq k\leq m\)的所有\(k\)分别 ...

  6. 【BZOJ3625】【codeforces438E】小朋友和二叉树 生成函数+多项式求逆+多项式开根

    首先,我们构造一个函数$G(x)$,若存在$k∈C$,则$[x^k]G(x)=1$. 不妨设$F(x)$为最终答案的生成函数,则$[x^n]F(x)$即为权值为$n$的神犇二叉树个数. 不难推导出,$ ...

  7. CF438E The Child and Binary Tree(生成函数+多项式开根+多项式求逆)

    传送门 可以……这很多项式开根模板……而且也完全不知道大佬们怎么把这题的式子推出来的…… 首先,这题需要多项式开根和多项式求逆.多项式求逆看这里->这里,这里讲一讲多项式开根 多项式开方:已知多 ...

  8. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  9. Codeforces 250 E. The Child and Binary Tree [多项式开根 生成函数]

    CF Round250 E. The Child and Binary Tree 题意:n种权值集合C, 求点权值和为1...m的二叉树的个数, 形态不同的二叉树不同. 也就是说:不带标号,孩子有序 ...

随机推荐

  1. Django用户验证框架

    一  分析源码 User   Django的标准库存放在 django.contrib 包中.每个子包都是一个独立的附加功能包. 这些子包一般是互相独立的,不过有些django.contrib子包需要 ...

  2. 6.Django扩展

    富文本编辑器 借助富文本编辑器,管理员能够编辑出来一个包含html的页面,从而页面的显示效果,可以由管理员定义,而不用完全依赖于前期开发人员 此处以tinymce为例,其它富文本编辑器的使用可以自行学 ...

  3. [译]C#和.NET中的字符串

    原文地址:Jon Skeet:Strings in C# and .NET System.String 类型(在C#语言中对应的别名是string)是.NET最重要的类型之一,不幸的是在它身上存在了太 ...

  4. INDEX--从数据存放的角度看索引

    测试表结构: CREATE TABLE TB1 ( ID ,), C1 INT, C2 INT ) 1. 聚集索引(Clustered index) 聚集索引可以理解为一个包含表中除索引键外多有剩余列 ...

  5. 迁移桌面程序到MS Store(3)——开机自启动

    迁移桌面程序的时候,有可能你会遇到这么个需求——开机自启动.Windows传统桌面程序的传统陋习.不论什么奇葩软件都想要开机自启动,默认就给你打开,一开机哐哐哐什么雷,什么企鹅都蹦出来,也不管你用不用 ...

  6. VS2017 v15.8.0 Task ExpandPriContent failed. Illegal characters in path

    昨天更新了VS到最新版本v15.8.0,但是编译UWP出现了操蛋的bug. 谷歌一下,vs社区已经有答案了. 打开.csproj文件,在节点 <PropertyGroup> 里面,加上一行 ...

  7. ASP.NET MVC的切片(Section)脚本(script)

    在ASP.NET MVC使用切片脚本,实在是很溜. 在使用layout之后,只是视图套用_Layout之后,在视图中任一位置任一时候均可以使用切片脚本. 首先在_Layout.cshtml定一些规则: ...

  8. Android sharedUserId 和系统权限

    sharedUserId 给不同的应用使用同一个 sharedUserId 可以运行在这几个应用间互相访问数据(数据库,SharedPreferences,文件). sharedUserId 一旦使用 ...

  9. “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  10. SQL注入之PHP-MySQL实现手工注入-数字型

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎 ...