求逆的过程如下:
poly inv()
{
int n = size();
poly res = {qpow(at(0), MOD - 2)}, a;
int cnt = 0;
for (int k = 1; k < n; k *= 2)
{
int len = k * 2;
a.assign(begin(), begin() + len);
int t = getrev(a.size() + len);
a.resize(t), res.resize(t);
NTT(a, t, 1), NTT(res, t, 1);
for (int i = 0; i < t; i++)
res[i] = mul(res[i], dim(2, mul(res[i], a[i])));
NTT(res, t, -1);
res.resize(len);
}
return res;
}
这段代码有这样一个问题:2k 可能比 n 大,实测导致了 a 数组后面出现了负数,在减法里会导致减的是个负数。
正确的做法是 len = std::min(n, 2 * k)。