单位根反演

首先我们有式子:

\[[n \mid m] = \frac{1}{n} \sum_{i=0}^{n-1} \omega_n^{im}\]

证明:设 \(f(x) = \sum_{i=0}^{n-1} x^i\),那么原式即为 \(f(\omega_n^m)\)。当 \(n \mid m\) 时,求和的每一项都是 \(1\),显然成立;否则有 \(f(x) = \frac{x^n - 1}{x - 1}\) 成立,由于 \(\omega_n^{nm} = 1\),故上式为 0。

这个式子可以扩展到 \(m \text{\ mod\ } n = k\) 的情况:

\[[m \text{\ mod\ } n = k] = [n \mid (m - k)] = \frac{1}{n} \sum_{i=0}^{n-1} \omega_n^{-ik} \omega_n^{im}\]

现在有多项式 \(f(x) = \sum_{i=0}^{n} a_i x^i\),要求其所有下标模 \(m\) 等于 \(k\) 的系数之和,有:

\[\sum_{i=0}^{n} a_i [i \text{\ mod\ } m = k] = \frac{1}{m} \sum_{i=0}^{n} a_i \sum_{j=0}^{m-1} \omega_m^{-jk} \omega_m^{ij}\]

交换求和符号:

\[\frac{1}{m} \sum_{j=0}^{m-1} \omega_m^{-jk} \sum_{i=0}^{n} a_i \omega_m^{ij} = \frac{1}{m} \sum_{j=0}^{m-1} \omega_m^{-jk} f(\omega_m^j)\]

这个式子的优势在于,如果多项式 \(f\) 的次数非常大,但它的点值可以在 \(O(T)\) 的时间复杂度内计算,就可以用上式在 \(O(mT)\) 的时间复杂度内求出 \(f\) 的所有下标模 \(m\)\(k\) 的系数之和。

举个例子,现在要求:

\[\sum_{i=0}^{n} [i \text{\ mod\ } m = k] \binom{n}{i} \text{\ mod\ } p\]

\(n\) 非常大,但 \(m\) 只有 \(10^6\)。由于组合数的 OGF 为 \((1 + x)^n\),答案即为:

\[\frac{1}{m} \sum_{i=0}^{m-1} \omega^{-ik} (1 + \omega^i)^n\]

如果 \(p \text{\ mod\ } m = 1\),那么找到 \(p\) 的原根 \(g\)\(g^{\frac{p-1}{m}}\) 即可作为 \(\omega_m\) 运算,复杂度为 \(O(m \log n)\)