Luogu P4238 多項式乘法逆 題解
阿新 • • 發佈:2021-07-25
\(\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}\)
顯然有
\[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 ; }