洛谷P5205 模板 多項式開根

2022-05-23 21:42:11 字數 2246 閱讀 5500

題目大意:給你$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)-2b(x)b_0(x)+b_0^2(x)≡0\pmod\\

b(x)\equiv\dfrac\pmod\\

$$update:(2019-2-10)

$$b(x)\equiv\dfrac\pmod\\

b(x)\equiv\dfrac+\dfrac2\pmod\\

$$發現$\dfrac2$只會影響$b(x)$陣列的前半部分(即$\pmod}$的部分),但是$b(x)\equiv b_0(x)\pmod}$,所以可以不做考慮,直接把$b_0(x)$拉過來

卡點:求$inv$時注意清空陣列,防止因為$b$陣列不乾淨導致出鍋

c++ code:

#include #include #include #define maxn 262144

const int mod = 998244353, __2 = mod + 1 >> 1;

namespace std

inline istream& operator >> (int &x)

#undef m

} cin;

struct ostream

static int s[20], *top; top = s;

while (x)

for (; top != s; --top) *++ch = *top;

return *this;

} inline ostream& operator << (const char x)

inline ~ostream()

#undef m

} cout;

}namespace math

inline int inv(int x)

}inline void reduce(int &x)

inline void clear(register int *l, const int *r)

namespace poly

inline void fft(int *a, const int op = 1)

} if (!op)

} void inv(int *a, int *b, int n)

const int len = n + 1 >> 1;

inv(a, b, len); init(len * 3);

static int c[n], d[n];

std::copy(a, a + n, c); clear(c + n, c + lim);

std::copy(b, b + len, d); clear(d + len, d + lim);

fft(d), fft(c);

for (register int i = 0; i < lim; ++i) d[i] = (2 - static_cast(d[i]) * c[i] % mod + mod) * d[i] % mod;

fft(d, 0); std::copy(d + len, d + n, b + len);

} void sqrt(int *a, int *b, int n)

static int c[n], d[n];

const int len = n + 1 >> 1;

sqrt(a, b, len);

inv(b, d, n), clear(d + n, d + lim);

std::copy(a, a + n, c); clear(c + n, c + lim);

fft(c), fft(d);

for (register int i = 0; i < lim; ++i) d[i] = static_cast(c[i]) * d[i] % mod * __2 % mod;

fft(d, 0); std::copy(d + len, d + n, b + len);

}#undef n

}int n, a[maxn], b[maxn];

int main()

洛谷5205 模板 多項式開根

點此看題面 大致題意 給定多項式 f x 求 g x 滿足 g x 2 equiv f x mod x n 向 998244353 取模。在知道多項式乘法逆的前提下,這道題的推導其實是非常簡單,甚至要簡單於多項式乘法逆的。但由於多項式開根最後的求解依然需要用到多項式乘法逆,所以總體難度還是高於多項式...

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 ...