思路

多项式求逆就是对于一个多项式\(A(x)\),求一个多项式\(B(x)\),使得\(A(x)B(x) \equiv 1 \ (mod x^n)\)

假设现在多项式只有一项,显然\(B(x)\)的第0项(常数项)就是\(A(x)\)的第0项(常数项)的逆元(所以\(A(x)\)有没有逆元取决于\(A(x)\)的常数项有没有逆元)

那我们可以利用递归的方法,

现在要求

\[A(x)B(x) \equiv 1 (mod\ x^n)
\]

假设有多项式\(B'(x)\),满足

\[A(x)B'(x)\equiv 1 (mod\ x^{\lfloor\frac{n}{2}\rfloor})
\]

则要求的\(B(x)\),必定也满足

\[A(x)B(x) \equiv 1 (mod\ x^{\lfloor\frac{n}{2}\rfloor})
\]

所以有

\[A(x)(B(x)-B'(x)) \equiv 0 (mod\ x^{\lfloor\frac{n}{2}\rfloor})\\B(x)-B'(x)\equiv 0 (mod\ x^{\lfloor\frac{n}{2}\rfloor})\\
(B(x)-B'(x))^2\equiv 0 (mod\ x^{n})\\
B^2(x)-2B(x)B'(x)+B'^2(x)\equiv 0 (mod\ x^{n})\\
\]

两侧都乘\(A(x)\)

\[B(x)-2B'(x)+2A(x)B'^2(x)\equiv 0 (mod \ x^n)
\]

所以

\[B(x)\equiv B'(x)(2-A(x)B'(x))
\]

递归求解即可

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int MOD = 998244353,G = 3, invG = 332748118;
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(a*ans)%MOD;
a=(a*a)%MOD;
b>>=1;
}
return ans;
}
void NTT(int *a,int n,int opt){
int lim=0;
while((1<<lim)<n)
lim++;
n=(1<<lim);
for(int i=0;i<n;i++){
int t=0;
for(int j=0;j<lim;j++)
if((i>>j)&1)
t|=(1<<(lim-j-1));
if(t<i)
swap(a[t],a[i]);
}
for(int i=2;i<=n;i<<=1){
int len=i/2;
int tmp=pow((opt)?G:invG,(MOD-1)/i);
for(int j=0;j<n;j+=i){
int mid=1;
for(int k=j;k<j+len;k++){
int t=a[k+len]*mid;
a[k+len]=(a[k]-t+MOD)%MOD;
a[k]=(a[k]+t)%MOD;
mid=(mid*tmp)%MOD;
}
}
}
if(!opt){
int invn=pow(n,MOD-2);
for(int i=0;i<n;i++)
a[i]=(a[i]*invn)%MOD;
}
}
int c[300100],a[300100],b[300100],n;
void get_inv(int times,int *a,int *b){
if(times==1){
b[0]=pow(a[0],MOD-2);
return;
}
get_inv((times+1)>>1,a,b);
while((times<<1)>n)
n<<=1;
for(int i=0;i<times;i++){
c[i]=a[i];
}
for(int i=times;i<n;i++){
c[i]=0;
}
NTT(c,n,1);
NTT(b,n,1);
for(int i=0;i<n;i++){
b[i]=((2-c[i]*b[i]%MOD)%MOD+MOD)%MOD*b[i]%MOD;
}
NTT(b,n,0);
for(int i=times;i<n;i++){
b[i]=0;
}
}
signed main(){
scanf("%lld",&n);
int tx=n;
for(int i=0;i<tx;i++)
scanf("%lld",&a[i]);
n=1;
get_inv(tx,a,b);
for(int i=0;i<tx;i++){
printf("%lld ",(b[i]+MOD)%MOD);
}
return 0;
}

P4238 【模板】多项式求逆的更多相关文章

  1. 洛谷 P4238 [模板] 多项式求逆

    题目:https://www.luogu.org/problemnew/show/P4238 看博客:https://www.cnblogs.com/xiefengze1/p/9107752.html ...

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

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

  3. 洛谷.4238.[模板]多项式求逆(NTT)

    题目链接 设多项式\(f(x)\)在模\(x^n\)下的逆元为\(g(x)\) \[f(x)g(x)\equiv 1\ (mod\ x^n)\] \[f(x)g(x)-1\equiv 0\ (mod\ ...

  4. [模板][P4238]多项式求逆

    NTT多项式求逆模板,详见代码 #include <map> #include <set> #include <stack> #include <cmath& ...

  5. 2018.12.30 洛谷P4238 【模板】多项式求逆

    传送门 多项式求逆模板题. 简单讲讲? 多项式求逆 定义: 对于一个多项式A(x)A(x)A(x),如果存在一个多项式B(x)B(x)B(x),满足B(x)B(x)B(x)的次数小于等于A(x)A(x ...

  6. 洛谷P4238【模板】多项式求逆

    洛谷P4238 多项式求逆:http://blog.miskcoo.com/2015/05/polynomial-inverse 注意:直接在点值表达下做$B(x) \equiv 2B'(x) - A ...

  7. [洛谷P4238]【模板】多项式求逆

    题目大意:多项式求逆 题解:$ A^{-1}(x) = (2 - B(x) * A(x)) \times B(x) \pmod{x^n} $ ($B(x)$ 为$A(x)$在$x^{\lceil \d ...

  8. luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)

    手动博客搬家: 本文发表于20181125 13:25:03, 原地址https://blog.csdn.net/suncongbo/article/details/84487306 题目链接: ht ...

  9. LG4238 【【模板】多项式求逆】

    前言 学习了Great_Influence的递推实现,我给大家说一下多项式求逆严格的边界条件,因为我发现改动一些很小的边界条件都会使程序出错.怎么办,背代码吗?背代码是不可能,这辈子都不会背代码的.理 ...

随机推荐

  1. MyEclipse 黑色主题 jsp 页面 js背景色修改

    Windows-->Preferences-->Myeclipse-->Files and Editors-->JavaScript-->Editor-->Synt ...

  2. keras 上添加 roc auc指标

    https://stackoverflow.com/questions/41032551/how-to-compute-receiving-operating-characteristic-roc-a ...

  3. QWidget 的 close 与 Qt::WA_DeleteOnClose

    [1]close 与 Qt::WA_DeleteOnClose简介 1.1 Qt源码 /*! Closes this widget. Returns \c true if the widget was ...

  4. 基于word2vec训练词向量(一)

    转自:https://blog.csdn.net/fendouaini/article/details/79905328 1.回顾DNN训练词向量 上次说到了通过DNN模型训练词获得词向量,这次来讲解 ...

  5. shell命令行快捷键

    ctrl+a[A]:将光标移到命令行开头 ctrl+e[E]:将光标移到命令行结尾 ctrl+c[C]:强制终止命令执行 ctrl+u[U]:删除/剪切光标之前的所有字符 ctrl+y[Y]:粘贴ct ...

  6. linux学习笔记---grep

    先来讲讲grep(搜索过滤) 1.命令格式: grep [option] pattern file 2.命令参数: -a 不要忽略二进制的数据 -A<显示行数>          除了显示 ...

  7. redis 五大数据类型以及操作

    一.redis的两种链接方式 1.简单连接 import redis conn = redis.Redis(host='10.0.0.200',port=6379) conn.set('k1','年后 ...

  8. kali linux中文输入法

    kali linux中文输入法 已经使用kali linux有一段时间来,越用越喜欢,真的奥! 最近又有宝宝问我kali linux的中文输入法,鉴于当初在坑里蹲了很长时间,还是记录一下吧! The ...

  9. django 模型类的常见字段约束,以及filter 过滤和查询

    null 不设置时默认设置为False.设置为True时,数据库表字段中将存入NULL的记录. null和blank组合使用,null=True,blank=True,表示该字段可以为空 blank ...

  10. Java排序之升序与降序

    以前在学校学排序的时候,总是自己写排序的代码,真正到工作中,直接使用java提供的排序方法,但最近发现行业默认的和学习时有些不一样. 以前总是在进行排序时如果前边的数字和后边数字的差为负则交换两个数字 ...