多项式求逆


和整数的乘法逆元定义类似,对于多项式\(A(x)B(x)=1\),则称\(A(x),B(x)\)互为乘法逆元。

\(A(x)\)存在乘法逆元的充要条件是\([x^0]A(x)\)存在乘法逆元。

现在思考如何用\(O(n\log n)\)的时间计算\(A(x)\)的乘法逆元:

考虑倍增,当前已求出前\(n\)项的逆元,则:\(A(x)B(x)\equiv 1\pmod{x^n}\)
\[ \begin{equation} \begin{split} A(x)B(x)-1&\equiv 0\pmod{x^n}\\ \Big(A(x)B(x)-1\Big)^2&\equiv0\pmod{x^{2n}}\\ A(x)^2B(x)^2-2A(x)B(x)+1&\equiv 0\pmod{x^{2n}}\\ 2A(x)B(x)-A(x)^2B(x)^2&\equiv1\pmod{x^{2n}}\\ A(x)B(x)\Big(2-A(x)B(x)\Big)&\equiv1\pmod{x^{2n}}\\ \end{split} \end{equation} \]
这样我们就能求出\(\mod{x^{2n}}\)下的逆元:\(B(x)\Big(2-A(x)B(x)\Big)\),重复\(O(\log n)\)次即可得到答案。

时间复杂度:\(T(n)=T(\frac n2)+O(n\log n)=O(n\log n)\)

代码:

例题:P4238 【模板】多项式求逆

//Luogu-O2
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define rint register int
typedef long long ll;#define Getchar (p1==p2&&(p2=(p1=In)+fread(In,1,1<<20,stdin),p1==p2)?EOF:*p1++)
char In[1<<20],*p1=In,*p2=In,Ch,Out[1<<20],*Outp=Out,St[25],*Tp=St;
inline int Getint(register int x=0)
{while(!isdigit(Ch=Getchar));for(;isdigit(Ch);Ch=Getchar)x=x*10+(Ch^48);return x;
}
inline void Putint(int x,char c)
{do *Tp++=x%10^48;while(x/=10);do *Outp++=*--Tp;while(Tp!=St);*Outp++=c;
}const int p=998244353,g1=3,g2=(p+1)/3;inline int Add(const int a,const int b){return (a+b)>=p?a+b-p:a+b;}
inline ll Pow(ll a,ll b,ll s=1){for(;b;b>>=1,a=a*a%p)if(b&1)s=s*a%p;return s;}namespace Poly
{int r[1<<18];void Pre(const int n){for(rint i=1,l=log2(n);i<n;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));}void NTT(const int n,int *A,const int g){for(rint i=1;i<n;++i)if(i<r[i])std::swap(A[i],A[r[i]]);for(rint i=2,h=1;i<=n;i<<=1,h<<=1)for(rint j=0,Rs=Pow(g,(p-1)/i);j<n;j+=i)for(rint k=0,Rt=1;k<h;++k,Rt=(ll)Rt*Rs%p){int Tmp=(ll)A[j+h+k]*Rt%p;A[j+h+k]=Add(A[j+k],p-Tmp),A[j+k]=Add(A[j+k],Tmp);}if(g==g2)for(rint i=0,In=Pow(n,p-2);i<n;++i)A[i]=(ll)A[i]*In%p;}int C[1<<18];void Inv(int n,int *A,int *B){if(n==1){B[0]=Pow(A[0],p-2);return;}Inv(n>>1,A,B),memcpy(C,A,n*sizeof(int));Pre(n<<1),NTT(n<<1,C,g1),NTT(n<<1,B,g1);for(rint i=0;i<(n<<1);++i)B[i]=B[i]*(2-(ll)C[i]*B[i]%p+p)%p;NTT(n<<1,B,g2),memset(B+n,0,n*sizeof(int));}
}int n,m,F[1<<18],G[1<<18];int main()
{n=Getint()-1;for(rint i=0;i<=n;++i)F[i]=Getint();for(m=n,n=1;n<=m;n<<=1);Poly::Inv(n,F,G);for(rint i=0;i<=m;++i)Putint(G[i],i==m?'\n':' ');return fwrite(Out,1,Outp-Out,stdout),0;
}

转载于:https://www.cnblogs.com/LanrTabe/p/11359952.html

[多项式算法]多项式求逆 学习笔记相关推荐

  1. 使用MATLAB求解方程求根——学习笔记

    使用MATLAB求解方程求根--学习笔记 碎碎念:终于参加完了某比赛,连续大约摸了两天的鱼,就在昨天由于自己的操作失误,亲手将电脑给烧了,这就是上天在暗示我是时候加油为接下来的两场比赛和一个考试努力啦 ...

  2. 陈宝林《最优化理论与算法》超详细学习笔记 (七)————第五章 运输问题

    陈宝林<最优化理论与算法>超详细学习笔记 (七)----第五章 运输问题 第1节 运输问题的数学模型 第2节 表上作业法 2.1 确定初始基可行解 2.2 最优解的判别 2.3 改进的方法 ...

  3. 陈宝林《最优化理论与算法》超详细学习笔记 (五)————最优性条件 之 KKT条件

    陈宝林<最优化理论与算法>超详细学习笔记 (五)----最优性条件 之 KKT条件 Lagrange对偶问题 原问题 Lagrange函数 Lagrange对偶函数 强/弱对偶性 弱对偶性 ...

  4. 陈宝林《最优化理论与算法》超详细学习笔记 (二)————补充知识(凸集) 第二章 线性规划的基本性质

    陈宝林<最优化理论与算法>超详细学习笔记 (二)----补充知识 凸集 & 第二章 线性规划的基本性质 补充知识 凸集 方向与极方向 表示定理 择一定理 第一章 线性规划的基本性质 ...

  5. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...

    机器学习实战(Machine Learning in Action)学习笔记----06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习 作者:米仓山下 时 ...

  6. 算法【二叉树】学习笔记 - 已知结点数计算可构建出多少种二叉树

    算法[二叉树]学习笔记 - 已知结点数计算可构建出多少种二叉树 卡特兰数 相关知识点 排列组合公式 排列 Arrangement 组合 Combination 分步计算 简化 参考资料 题目:已知3个 ...

  7. 陈宝林《最优化理论与算法》超详细学习笔记 (八)————最优性条件

    陈宝林<最优化理论与算法>超详细学习笔记 (八)----最优性条件 无约束问题的极值条件 必要条件 二阶充分条件 充要条件 约束极值问题的最优性条件 不等式约束的一阶最优性条件 无约束问题 ...

  8. 陈宝林《最优化理论与算法》超详细学习笔记 (四)————第四章 对偶理论

    陈宝林<最优化理论与算法>超详细学习笔记 (四)----第四章 对偶理论 1. 对偶问题的提出 2. 线性规划的对偶理论 2.1 原问题与对偶问题的关系 2.2 对偶问题的基本性质 3. ...

  9. 陈宝林《最优化理论与算法》超详细学习笔记 (一)————第十章 使用导数的最优化方法(最速下降法、牛顿法、阻尼牛顿法)

    陈宝林<最优化理论与算法>超详细学习笔记 (一)----第十章 使用导数的最优化方法(最速下降法.牛顿法.阻尼牛顿法) 写在前面 第十章 使用导数的最优化方法 最速下降法 牛顿法 阻尼牛顿 ...

最新文章

  1. 德鲁克对管理的十大看法
  2. opencv 计时 帧率
  3. boost::hana::detail::has_duplicates用法的测试程序
  4. 深度学习弯道超车,领先行业不止一点点
  5. 《Python数据分析与挖掘实战》一1.2 从餐饮服务到数据挖掘
  6. DSS流媒体服务器搭建
  7. 英雄联盟微信登录服务器怎么回事,英雄联盟微信怎么登陆 lol微信登录功能开放大区一览...
  8. pytorch教程之nn.Module类详解——使用Module类来自定义网络层
  9. Nginx跨域配置、限制连接、限制下载速度
  10. ajax成功后没有执行函数,ajax不执行回调函数
  11. Nginx学习笔记:基础
  12. 剑指offer面试题55 - II. 平衡二叉树(后序遍历)(剪枝)
  13. SELU︱在keras、tensorflow中使用SELU激活函数
  14. [EACL17]K-best Iterative Viterbi Parsing(K-best迭代维特比句法分析)
  15. js 自定义DOM事件
  16. java游戏下载怎么玩_jar的手机游戏怎么玩?java手机游戏的玩法
  17. 姓名常用汉字代码查询器
  18. 使用libx265对YUV进行h265编码
  19. matlab图像光照效果模拟
  20. bcdedit无法打开启动配置数据存储拒绝访问

热门文章

  1. Linux 命令之 who -- 打印当前登录用户/显示目前登入系统的用户信息。
  2. Linux 命令之 head -- 在屏幕上显示指定文件的开头若干行/显示文件开头内容/查看文件开头内容
  3. c# java 哪个好 流媒体_C#Net7mma H264 / PCMU流媒体
  4. mysql按加号没反应_请各位大哥给小老弟解疑答惑一下 为什么点击加号没有反应?感谢...
  5. 微信小程序view动态长度_微信小程序实现动态获取元素宽高的方法分析
  6. java package报错_Java基础知识总结 - 超详细篇(上)
  7. java左上角图标太小_Eclipse在高分屏下图标过小的解决方法
  8. Python3判断是否为回文数
  9. linux adb 端口,linux 无法连接adb 设备
  10. pat 乙级 1004 成绩排名(C++)