1. 程式人生 > 其它 >Luogu P4238 多項式乘法逆 題解

Luogu P4238 多項式乘法逆 題解

\(\text{cnblogs}\)

\(\text{Luogu Blogs}\)

\(\texttt{Description}\)

\(\operatorname{deg}=n\) 的多項式 \(f\),求多項式 \(g\),滿足

\[f*g\equiv 1 \pmod {x^n} \]

係數對 \(998244353\) 取模。

\(\texttt{restrictions:}1\le n\le10^5\)

\(\texttt{Solution}\)

假設 \(\operatorname{deg}=1\),則可以通過快速冪直接求出來,所以考慮遞迴。

假設我們已經求出 \(h*f \equiv 1 \pmod {x^n}\)

,考慮如何轉移到 \(x^{2n}\)

顯然有

\[f*g\equiv 1\pmod {x^n} \]

於是有

\[f*(g-h)\equiv 0 \pmod {x^n} \]\[g-h \equiv 0 \pmod {x^n} \]\[(g-h)^2 \equiv 0 \pmod {x^{2n}} \]\[g^2-2gh+h^2\equiv 0 \pmod {x^{2n}} \]

同乘 \(f\),有。

\[g-2h+fh^2\equiv 0\pmod {x^{2n}} \]\[g\equiv h(2+fh)\pmod {x^{2n}} \]

即可求解。

\(\texttt{Code}\)

inline friend Poly Inv(Poly a) {
      if (a.size() == 1) {
        Poly tmp(1) ;
        return tmp[0] = ksm(a[0]),tmp ;
      }
      const int len = a.size() ;
      Poly ta = a; ta.resize((len + 1) >> 1) ;
      Poly tb = Inv(ta) ;
      Getrev(len << 1),a.resize(lim),tb.resize(lim),a.ntt(lim,1),tb.ntt(lim,1) ;
      for (int i = 0; i < lim; ++i) tb[i] = 1ll * tb[i] * (mod + 2 - 1ll * a[i] * tb[i] % mod) % mod ;
      return tb.ntt(lim,-1),tb.resize(len),tb ;
    }