5.3 幂级数与拉格朗日插值

\({\Large 约定}\)

  1. 用集合符号表示位运算符号,用 $ \oplus $ 表示异或,特别的,$ i \in S$ 表示二进制数 \(S\) 的第 \(i\) 位为 \(1\)
  2. \(V\) 表示值域,\(\sum\) 表示字符集,\(\omega\) 表示 bitset 的常数 \((\omega = 64)\)
  3. 除去用 \(()/[]\) 表示开闭区间外,\([]\) 仅表示艾弗森约定,\(\{\}\) 仅表示集合,括号嵌套全用 \(()\)
  4. 字符串或序列角标为区间表示对应区间的子串

problems

\(\textcolor{white}{\mathrm{pw:sxyzoiers}}\)

P3803 【模板】多项式乘法(FFT)

\(\textcolor{purple}{\mathrm{省选/NOI−}}\) tag 快速傅里叶变换 FFT

摆了。
好像 IFFT 还可以按照 FFT 求完之后翻转 \([1,2^n)\),这样也是可以的。

参考文献(FFT)
参考文献(NTT)

FFT:submission

NTT:submission

2026.01.13

P4238 【模板】多项式乘法逆

\(\textcolor{purple}{\mathrm{省选/NOI−}}\) tag 快速傅里叶变换 FFT 数学 递归

给定一个多项式 \(F(x)\) ,请求出一个多项式 \(G(x)\), 满足 \(F(x) * G(x) \equiv 1 \pmod{x^n}\)。系数对 \(998244353\) 取模。
我们可以对这个式子略做变换,变成如下的式子:
\(F(x)-\frac 1 G(x)\equiv 0\pmod {x^n}\)
这个东西可以用牛顿迭代公式计算。但是我不会推导,可以看下面的文章。感觉原理就是把多项式看成一个函数,我们要找到它的零点,显然我们可以每次对这个点求导(?)计算一下与 \(x\) 轴的交点,然后一直做下去,这样精度就会逐渐增加。
结论大概就是,已知一个复合多项式
\(G(F(x))\equiv 0\pmod {x^n}\)
已知 \(F_0(x)\equiv F(x)\pmod {x^{\lceil \frac n 2\rceil}}\),求 已知 \(F_1(x)\equiv F(x)\pmod {x^n}\)
经过一通推理计算整理得到:
\(F_1(x)=F_0(x)-\frac {G(F_0(x))} {G'(F_0(x))}\)
后面的 \(-\frac {G(F_0(x))} {G'(F_0(x))}\) 就是计算导数与 \(x\) 轴的交点与当前的 \(x\) 的距离,不断逼近。
下面是这个东西的运用。
我们可以把这里的运算看成多项式的运算。
\(H(t)=F(x)-\frac 1 t\),那么就可以得到:
\(H(G(x))\equiv 0\pmod {x^n}\)
套入牛顿迭代公式就变成了:
\(G_1(x)=G_0(x)-\frac {H(G_0(x))}{H'(G_0(x))}\)
\(H(t)=F(x)-\frac 1 t\) 带入,因为 \(F(x)\) 是一个已知的多项式可以看作常数,那么 \(H'(G_0(x))=\frac {1}{G_0(x)^2}\),可以得到:
\(G_1(x)=G_0(x)-\frac {F(x)-\frac {1}{G_0(x)}}{\frac {1}{G_0(x)^2}}\)
化简一下得到:
\(G_1(x)=G_0(x)(2-G_0(x)F(x))\)
这里的 \(2\) 可以在做完 \(G_0(x)F(x)\) 的 NTT 之后处理一下即可,因为这只是常数上的加减。
有一些细节。
NTT 区间的长度一定要开够啊啊啊!

Code
void INV(int *g, int *f, int n) {
    if (n == 1) return g[0] = ksm(f[0], mod - 2), void();
    INV(g, f, (n + 1) >> 1);
    static int c[N];
    int h = 1;
    while(h < (n << 1))  h <<= 1;
    REP(i, 0, h - 1)  tr[i] = (tr[i >> 1] >> 1) | ((i & 1) ? h >> 1 : 0);
    REP(i, 0, n - 1)  c[i] = f[i];
    REP(i, n, h - 1)  c[i] = 0;
    ntt(c, h, 1), ntt(g, h, 1);
    REP(i, 0, h - 1)  g[i] = g[i] * (2ll - g[i] * c[i] % mod + mod) % mod;
    ntt(g, h, -1);
    REP(i, n, h - 1)  g[i] = 0;
    return;
  }

参考文献1
参考文献2
参考文献3

submission

2026.01.15

posted @ 2026-01-13 14:14  yqfff_qwq  阅读(2)  评论(0)    收藏  举报