點此看題面
大致題意:給定多項式\(f(x)\),求\(g(x)\)滿足\(g(x)^2\equiv f(x)(mod\ x^n)\),向\(998244353\)取模。
在知道多項式乘法逆的前提下,這道題的推導其實是非常簡單,甚至要簡單於多項式乘法逆的。
但由於多項式開根最後的求解依然需要用到多項式乘法逆,所以總體難度還是高於多項式乘法逆的?
按照多項式乘法逆的套路,我們可以遞迴求解此題。
對於邊界,顯然當遞迴到\(n=0\)的時候,由於題目保證\(a_0=1\),所以\(b_0=1\)。
(話說如果\(a_0\)不等於\(1\),那麼可能會有多個\(b_0\)滿足\(b_0^2\equiv1\),我也很想知道這樣子該怎麼去做)
否則,假設我們當前已知:
\[h(x)^2\equiv f(x)(mod\ x^)
\]由於\(g(x)^2\equiv f(x)(mod\ x^n)\),所以顯然可知
\[g(x)^2\equiv f(x)(mod\ x^)
\]則,顯然就可以得到:
\[g(x)-h(x)\equiv0(mod\ x^)
\]考慮我們現在要求出乙個多項式,滿足與\(f(x)\)卷積模\(x^n\)餘\(1\)。
則顯然,我們必須要想辦法,讓此處的模數由\(x^\)變為\(x^n\)。
怎麼辦呢?將式子兩邊同時平方便可。即:
\[(g(x)-h(x))^2\equiv0(mod\ x^n)
\]用完全平方公式拆平方:
\[g(x)^2-2g(x)*h(x)+h(x)^2\equiv0(mod\ x^n)
\]然後,由於\(g(x)^2\equiv f(x)(mod\ x^n)\),所以:
\[f(x)-2g(x)*h(x)+h(x)^2\equiv0(mod\ x^n)
\]此時只要通過移項就可以得到:
\[g(x)\equiv\frac(mod\ x^n)
\]關於這個式子,只要用\(ntt\)+多項式乘法逆就可以求解了。
注意在具體實現中,\(g(x)\)和\(h(x)\)完全可以存在乙個陣列中。
#include#define tp template#define ts template#define reg register
#define ri reg int
#define con const
#define ci con int&
#define i inline
#define w while
#define n 100000
#define x 998244353
using namespace std;
int n,a[n+5],b[n<<2];
i int qp(ri x,ri y)
class poly
i void inv(ci n,int *a,int *b)//多項式乘法逆
}p;int main()
洛谷P5205 模板 多項式開根
題目大意 給你 n 項多項式 a x 求出 b x 滿足 b 2 x equiv a x pmod 題解 考慮已經求出 b 0 x 滿足 b 0 2 x equiv a x pmod b x b 0 x equiv0 pmod b 2 x 2b x b 0 x b 0 2 x 0 pmod a x ...
Luogu P5205 模板 多項式開根
給定乙個 n 1 次多項式 a x 求乙個在 bmod x n 意義下的多項式 b x 使得 b 2 x equiv a x bmod x n 多項式的係數在 bmod 998244353 的意義下進行運算。n leq 10 5,a i in 0,998244352 cap mathbb 其實推導過...
多項式開根小結
跟 exp expex p 套路是一樣的,套乙個牛頓迭代就出來了。給出多項式 a x a x a x 求出乙個多項式 g x g x g x 滿足 g2 x a x modx n g 2 x equiv a x pmod g2 x a x mod xn 設 f g x g2 x a x f g x ...