单位根反演
[n|k]⇔1nn−1∑i=0ωikn
(千万记得乘 1n)
如果 [n|k] 那么都是 1
反之则用等比数列得到 1nωnkn−1ωkn−1=0
用处是求某个多项式的特定倍数的系数和,也就是:
⌊nk⌋∑i=0[xik]f(x)=1kk−1∑j=0f(ωjk)
把枚举上界换掉,大力展开之后就行了
应用
bzoj3328 PYXFIB
求
⌊nk⌋∑i=0(nik)Fik%mod
满足 mod≡1modk,Fik 为斐波那契数列第 ik 项
那么把原始展开得到的式子合并完了如下:
n∑i=0[k|i](ni)fi=n∑i=0(ni)fi1kk−1∑j=0ωjik=1kk−1∑j=0n∑i=0(ni)fi(ωjk)i
后面的部分把 ωjk 和矩阵做数乘就行了
复杂度 Θ(Tk+8klogn)
需要预处理原根
Loj 6485 LJJ学二项式定理
把几个独立下来之后,考虑 a0 的部分,则有
n∑i=0(ni)[4|i]sia0
那么换掉式子就是
14n∑i=03∑j=0(ni)siwij
二项式定理合并即可,对于剩下的几个,被模数就是 i+k 其实照样推就行了
代码很好写
UOJ450 复读机
本题也是在某种意义上 EGF 第一题
- Subtask 1:d=1
直接输出 kn 即可
以下两个部分均需注意,EGF 的卷积最后乘 n! 才是正确答案
- Subtask 2:d=2
把脑残式子一写:诶这怎么是 EGF 卷起来的形式呀?
G(x)=+∞∑i=0[2|i]xii!
答案即 Gk(x)[xn]
问题似乎陷入了死节,但是使用 ex=+∞∑i=0xii! 变换一下:
ansn!=[xn]Gk(x)=[xn](ex+e−x2)k
使用 ekx=+∞∑i=0(kx)ii! 大力展开所有的取出 xn 的系数,得到:
ansn!=12kk∑i=0(ki)(2i−k)nn!
使用 O(k) 的算法可以快速解决这个问题
- Subtask 3:d=3,k≤1000
仍然使用 G(x)=+∞∑i=0[3|i]xii! 的 k 次方的系数来计算答案
这时候很悲惨,莫得 ex+e−x 了,但是出现了可以拿单位根反演化开的东西,继续推到不难得到:
G(x)=+∞∑i=0xii!132∑j=0ωij3
(其实 −1=ω12 )
把 13 提出来,把 (ωj3)i 和外面合并之后仍然可以使用 ekx 的式子简化 G(x) 的表达
G(x)=13+∞∑i=0(ω03x)i+(ω13x)i+(ω23x)ii!=13(eω03+ω13+ω23)
这样子再进行 k 次方操作就会舒适许多,仍然是二项式定理配合组合意义展开
Gk(x)=k∑i=0(ki)(eω03)k−ii∑j=0(ij)(eω13)j(eω23)i−j
那么把 e 的次幂堆到一起展开(不放到一起就没法做了)得到
ansn!=1n!3kk∑i=0i∑j=0(ki)(ij)(k−i+ω23(i−j)+ω13j)n
使用原根 g=7 的 mod−13 来表示单位根
Θ(k2) 的做法就足够了,代码实现是简单的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律