Preface
我发现我现在学一个新算法总是把相关题目做完了才来写233
单位根反演总的来说不是一个非常难的姿势,但是确实解决某些问题的必要前提
它可以在(O(k))的时间内求一个数列(或是生成函数)所有下标是(k)的倍数的点值和
以下的一些基础姿势例如单位根的性质及求法等以下不再赘述
Formula
先上单位根反演的公式:
[[k|n]=frac{1}{k}sum_{i=0}^{k-1}omega_k^{ni}
]
我们来考虑证明这个公式,分类讨论:
若(k|n),那么:
[frac{1}{k}sum_{i=0}^{k-1}omega_k^{ni}=frac{1}{k}sum_{i=0}^{k-1}(omega_k^n)^i=frac{1}{k}sum_{i=0}^{k-1}omega_k^0=1
]
若(k ot| n),那么根据等比数列求和有:
[frac{1}{k}sum_{i=0}^{k-1}omega_k^{ni}=frac{1}{k}(omega_k^0cdot frac{omega_k^0-omega_k^{kn}}{1-omega_k^n})
]
由于其分子为(1-1=0),因此该公式成立
Others
有些时候我们只知道(k|n)的点值和还不够,比如说我们要知道下标(mod k=r)的点值和
考虑通过函数的平移来解决问题,如果我们此时将该序列的生成函数乘上(x^{-r})再套用上面的方法就可以得到答案了
Example
给几道简单点的例题练练手吧
- LOJ #6485. LJJ 学二项式定理 生成函数+单位根反演 sol
- BZOJ 3328: PYXFIB 生成函数+单位根反演 sol
- UOJ #450. 【集训队作业2018】复读机 生成函数+单位根反演 sol
Postscript
最近感悟到了生成函数之美,因此最近的做题方向也在想着数学题的方向靠近吧233