洛谷5205 模板 多項式開根

2022-05-14 13:54:11 字數 1532 閱讀 5429

點此看題面

大致題意:給定多項式\(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 ...