題目大意:給你$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 262144const 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 ...