Skip to content

多项式乘法逆 ​

给定一个多项式 F(x)F(x) ,请求出一个多项式 G(x)G(x), 满足 F(x)∗G(x)≡1(modxn)F(x) * G(x) \equiv 1 \pmod{x^n}。系数对 998244353998244353 取模。

牛顿迭代法 已知一个复合多项式 G(F(x))≡0(mod  xn)G(F(x)) \equiv 0(\mod x^n),假设 F0(x)≡F(x)(mod  xn2),F1(x)≡F(x)(mod  xn)F_0(x) \equiv F(x)(\mod x^{\frac{n}{2}}),F_1(x) \equiv F(x)(\mod x^n)

泰勒公式在F0(x)F_0(x)展开G(F(x))G(F(x)),G(F(x))=∑i=0∞G(i)F0(x)i!(F(x)−F0(x))iG(F(x))=\sum_{i=0}^{\infty}\frac{G^{(i)}F_0(x)}{i!}(F(x)-F_0(x))^i

G(F1(x))≡G(F0(x))+G′(F0(x))(F1(x)−F0(x))(mod  xn)G(F_1(x)) \equiv G(F_0(x))+G'(F_0(x))(F_1(x)-F_0(x))(\mod x^n)

F1(x)=F0(x)−G(F0(x))G′(F0(x))F_1(x)=F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}

将H(t)=F(x)−1tH(t)=F(x)-\frac{1}{t}套进去

G1(x)=G0(x)−F(x)−1G0(x)1G0(x)2G_1(x)=G_0(x)-\frac{F(x)-\frac{1}{G_0(x)}}{\frac{1}{G_0(x)^2}}

G1(x)=G0(x)(2−G0(x)F(x))G_1(x)=G_0(x)(2-G_0(x)F(x))

cpp
poly inv(poly &f,int n){
    if(n==1)return {qpow(f[0],P-2)};
    auto g=inv(f,n+1>>1);
    static vector<int> c;
    init(2*n+1);
    c.resize(tot);
    g.resize(tot);
    for(int i=0;i<n;i++)c[i]=f[i];
    for(int i=n;i<tot;i++)c[i]=0;
    ntt(c,1),ntt(g,1);
    for(int i=0;i<tot;i++)g[i]=g[i]*(2-c[i]*g[i]%P+P)%P;
    ntt(g,-1);
    for(int i=n;i<tot;i++)g[i]=0;
    return g;
}
void solve(){
    int n;
    cin>>n;
    poly f(n+1);
    for(int i=0;i<n;i++)cin>>f[i];
    auto g=inv(f,n);
    for(int i=0;i<n;i++)cout<<g[i]<<" ";
}