警钟长鸣
查看原帖
警钟长鸣
176205
uncesspath楼主2023/12/13 12:45

求逆的过程如下:

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;
}

这段代码有这样一个问题:2k2k 可能比 nn 大,实测导致了 a 数组后面出现了负数,在减法里会导致减的是个负数。

正确的做法是 len = std::min(n, 2 * k)。

2023/12/13 12:45
加载中...