模板:多项式乘法逆元

给出一个度为n−1n-1n−1的多项式f(x)f(x)f(x),求一个度为n−1n-1n−1的g(x)g(x)g(x),使得f(x)⋅g(x)≡1(modxn)f(x)\cdot g(x) \equiv1\ (mod\ x^n)f(x)⋅g(x)≡1 (mod xn)

这里的多项式modxkmod\ x^kmod xk的意思是舍弃掉所有次数≥k\geq k≥k的项后的多项式

Solution:

多项式的操作似乎都是分治解决的

若我们找到一个t(x)t(x)t(x),使得

f(x)⋅t(x)≡1(modx⌈n2⌉)(1)f(x)\cdot t(x)\equiv 1\ (mod\ x^{\lceil\frac{n}{2}\rceil})\tag{1} f(x)⋅t(x)≡1 (mod x⌈2n​⌉)(1)

因为

f(x)⋅g(x)≡1(modxn)f(x)\cdot g(x)\equiv1\ (mod\ x^{n}) f(x)⋅g(x)≡1 (mod xn)

于是有

f(x)⋅g(x)≡1(modx⌈n2⌉)(2)f(x)\cdot g(x)\equiv1\ (mod\ x^{\lceil\frac{n}{2}\rceil})\tag{2} f(x)⋅g(x)≡1 (mod x⌈2n​⌉)(2)

将(1)(1)(1)与这个式子做差,有

f(x)⋅(t(x)−g(x))≡0(modx⌈n2⌉)f(x)\cdot(t(x)-g(x)) \equiv0\ (mod\ x^{\lceil\frac{n}{2}\rceil}) f(x)⋅(t(x)−g(x))≡0 (mod x⌈2n​⌉)

由于f(x)f(x)f(x)不可能为0,于是

t(x)−g(x)≡0(modx⌈n2⌉)t(x)-g(x)\equiv0\ (mod\ x^{\lceil\frac{n}{2}\rceil}) t(x)−g(x)≡0 (mod x⌈2n​⌉)

两边平方并移项有

g2(x)≡2⋅t(x)⋅g(x)−t2(x)(modx⌈n2⌉)g^{2}(x)\equiv2\cdot t(x) \cdot g(x)-t^{2}(x)\ (mod\ x^{\lceil\frac{n}{2}\rceil}) g2(x)≡2⋅t(x)⋅g(x)−t2(x) (mod x⌈2n​⌉)

左右两边乘f(x)f(x)f(x),得到

f(x)⋅g2(x)≡2⋅f(x)⋅t(x)⋅g(x)−f(x)⋅t2(x)(modx⌈n2⌉)f(x)\cdot g^{2}(x)\equiv2\cdot f(x)\cdot t(x) \cdot g(x)-f(x)\cdot t^{2}(x)\ (mod\ x^{\lceil\frac{n}{2}\rceil}) f(x)⋅g2(x)≡2⋅f(x)⋅t(x)⋅g(x)−f(x)⋅t2(x) (mod x⌈2n​⌉)

由(1)(2)(1)(2)(1)(2)两式,代入得到

g(x)≡2⋅t(x)−f(x)⋅t2(x)(modx⌈n2⌉)(3)g(x)\equiv 2\cdot t(x)-f(x)\cdot t^{2}(x)\ (mod\ x^{\lceil\frac{n}{2}\rceil})\tag{3} g(x)≡2⋅t(x)−f(x)⋅t2(x) (mod x⌈2n​⌉)(3)

于是我们求g(x)g(x)g(x)可以先求t(x)t(x)t(x),求t(x)t(x)t(x)可以先求(modx⌈n4⌉)(mod\ x^{\lceil\frac{n}{4}\rceil})(mod x⌈4n​⌉),递归出口即求(modx)(mod\ x)(mod x),此时只剩常数项,多项式逆元就是常数项逆元

tips:

(3)(3)(3)式递推时不需要多次ntt,我们只要把他们转换为点值式后直接运算就可以了,不过需要注意的是,这里面发生了三个多项式相乘,因此相乘时limitlimitlimit要设为大于三个多项式的度总和的一个2的幂

// #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
using namespace std;using ll=long long;
const int N=270005,inf=0x3fffffff;
const long long INF=0x3f3f3f3f3f3f,mod=998244353,inv3=332748118;int getlen(int k)
{int ret=0;while(k){ret++;k>>=1;}return ret;
}int getrev(int k,int len)
{int ret=0;while(k){ret=(ret<<1|(k&1));k>>=1;len--;}return ret<<len;
}ll qpow(ll a,ll b)
{ll ret=1,base=a;while(b){if(b&1) ret=ret*base%mod;base=base*base%mod;b>>=1;}return ret;
}ll inv(ll k){return qpow(k,mod-2);}int pos[N];void ntt(ll *a,int limit,int op)
{for(int i=0;i<limit;i++)if(i<pos[i]) swap(a[i],a[pos[i]]);for(int len=2;len<=limit;len<<=1){ll base=qpow(op==1?3:inv3,(mod-1)/len);for(int l=0;l<limit;l+=len){ll now=1;for(int i=l;i<l+len/2;i++){ll x=a[i]%mod,y=now*a[i+len/2]%mod;a[i]=(x+y)%mod;a[i+len/2]=(x-y+mod)%mod;now=now*base%mod;}}}
}ll a[N],b[N];inline void multi(ll *f,ll* g,int n,int m)//f*=g
{int limit=1;while(limit<=n+2*m) limit<<=1;//此处式n+2*m,三个多项式相乘了int len=getlen(limit-1);for(int i=0;i<limit;i++){pos[i]=getrev(i,len);a[i]=f[i]; b[i]=g[i];}ntt(a,limit,1); ntt(b,limit,1);for(int i=0;i<limit;i++) a[i]=b[i]*((2-a[i]*b[i]%mod)%mod+mod)%mod;ntt(a,limit,-1);ll tmp=inv(limit);for(int i=0;i<limit;i++) f[i]=a[i]*tmp%mod;
}int n,nn;
ll f[N],g[N],t[N];void solve(int len)
{if(len==1){t[0]=inv(f[0]);return;}solve(len+1>>1);//此处一定要Len/2上取整for(int i=0;i<n;i++) g[i]=f[i];multi(g,t,n,len+1>>1);for(int i=0;i<len;i++) t[i]=g[i];for(int i=len;i<n+2*(len+1>>1);i++) g[i]=t[i]=0;
}int main()
{cin>>n;for(int i=0;i<n;i++) cin>>f[i];solve(n);for(int i=0;i<n;i++) printf("%lld ",g[i]);return 0;
}

洛谷P4238 多项式乘法逆元相关推荐

  1. 洛谷 P3803 多项式乘法

    题目背景 这是一道FFT模板题 题目描述 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输入输出格式 输入格式: 第一行2个正整数n,m. 接下来一行n+1 ...

  2. 洛谷 P1067 多项式输出

    题目 (Markdown编辑器复制这个修改太麻烦,索性直接粘贴网址了...) 网址如下: 洛谷 P1067 多项式输出 题解 这是个简单的模拟题,不算复杂.题目大意就是给你一个数 n ,以及 n + ...

  3. 洛谷1067 多项式输出 解题报告

    洛谷1067 多项式输出 本题地址: http://www.luogu.org/problem/show?pid=1067 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i ...

  4. 洛谷--P1067 多项式输出

    题目描述 一元nn次多项式可用如下的表达式表示: 其中,a_ix^iai​xi称为ii次项,a_iai​ 称为ii次项的系数.给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式: ...

  5. 洛谷P4238 【模板】多项式求逆(NTT)

    传送门 学习了一下大佬的->这里 已知多项式$A(x)$,若存在$A(x)B(x)\equiv 1\pmod{x^n}$ 则称$B(x)$为$A(x)$在模$x^n$下的逆元,记做$A^{-1} ...

  6. 洛谷——P1067 多项式输出

    https://www.luogu.org/problem/show?pid=1067#sub 题目描述 一元 n 次多项式可用如下的表达式表示: 其中,aixi称为 i 次项,ai 称为 i 次项的 ...

  7. 洛谷P1067 多项式输出

    .. 题目描述 一元nn次多项式可用如下的表达式表示: f(x)=a_nx^n+a_{n-1}x^{n-1}+\cdots +a_1x+a_0,a_n\ne 0f(x)=an​xn+an−1​xn−1 ...

  8. Python在GF(2⁸)有限域上求解多项式的乘法逆元——基于扩展欧几里得算法

    文章目录 一.前言 二.数学基础 1.GF(2⁸)有限域内的多项式 2.不可约多项式 3.多项式模运算 3.乘法逆元 三.算法步骤 1.扩展欧几里得算法 2.多项式除法 3.多项式乘法 四.代码实现 ...

  9. 洛谷算法题单:模拟与高精度例题(下)

    接着上篇的例题. 1.洛谷P4924魔法少女小Scarlet 题目描述: Scarlet最近学会了一个数组魔法,她会在n∗n二维数组上将一个奇数阶方阵按照顺时针或者逆时针旋转90°, 首先,Scarl ...

  10. 洛谷——P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 线性求逆元 逆元定义:若$a*x\equiv1 (\bmod {b})$,且$a$与$b$互质,那么我们就能定义: $x$为$a$的逆元,记为$a^{-1}$,所以我们也 ...

最新文章

  1. 爬虫正则表达式遇到的困难
  2. energy计算机电脑,energy management
  3. 问答机器人2.0!文档问答产品科普
  4. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...
  5. 空心心形图案的c语言程序,C语言写的各种心形图案_6583
  6. 安装MyEclipse10 并且破解(附带软件包)
  7. 1到10加法创新图片-走迷宫_“小火锅+关东煮”,呷哺呷哺又创新模式!客单提到110元!...
  8. 魔兽地图服务器修改,魔兽争霸3冰封王座地图编辑器修改无限人口的方法
  9. Coursera Algorithm Ⅱ week4 编程作业 Boggle
  10. 招聘网探究分析报告(以描述性分析为主)
  11. Shell脚本模拟用户行为刷App积分,学习娱乐之用,再加图像数字识别验证码登录
  12. PDF生成插件--TcPDF
  13. Orbit Downloader 小巧无广告的下载工具,超赞的在线视频下载能力,比迅雷清爽多了!
  14. SQL server 快捷键整理
  15. bootloader详解----bootloader的基本概念
  16. 《密码朋克:自由与互联网的未来》[澳] 朱利安-阿桑奇
  17. 关于VeryCD下载的关闭
  18. win8计算机虚拟内存,大内存的时代,Win8下虚拟内存存在的必要性
  19. 互联网:2023年,省市县行政区划名称及编码对照表、最新省市区表1
  20. 大连理工大学城市学院计算机日语,2018年大连理工大学城市学院日语专业4级报名资格...

热门文章

  1. python绘制三重积分图像_三重积分-图解高等数学13 | 文艺数学君
  2. QuerySet,本质上是一个给定的模型的对象列表
  3. Android 微信分享不显示分享出去的图标问题
  4. 《人性的弱点》【美】戴尔 卡耐基 读书笔记
  5. An exception was thrown while activating xxxxController
  6. python标准库calendar判断年份是闰年和平年
  7. 华为开源自研AI框架昇思MindSpore CPU-Ubuntu版本 Pip自动安装教程
  8. 《目标》读后感,一本小说体的管理学著作
  9. You are using pip version 21.2.4; however, version 22.0.4 is available.
  10. uni-app 多个视频同时播放问题(h5和app)及获取视频第一帧 亲测有用