-
Luogu P2000拯救世界
生成函数的入门题,对于每一个限制条件,若为 k 的倍数则生成函数为 11−xk,若为 ≥k 则为 1−xk+11−x。最后用广义二项式定理求出第 n 项系数即可。
-
CF438E The Child and Binary Tree
设 fi 表示权值和为 i 的方案数,记 ai 为权值 i 的出现次数,则:
fi={1i=0∑j+p+q=iajfpfqi≥1
记 A(x)=∑mi=1aixi,fi 的 OGF 为 F(x),则 F(x)=1+A(x)F2(x)。( +1 是补全 fp,fq 的常数项)
再一些题解中,直接使用求根公式来解出上面的式子,但是考虑 ai 的定义,发现 A(x) 的零次项为 0,故不存在逆元,所以不能直接求根。可以先将等式两边同乘 A(x),整理可得:
A2(x)F2(x)−A(x)F(x)+A(x)=0(A(x)F(x)−12)2=14−A(x)
若 A(x)F(x)−12=√14−A(x)( 14−A(x) 的零次项为 14,存在逆元),那么:A(x)F(x)=√1−4A(x)+12。但是,右式是零次项为 1,但是左边的零次项为 0,所以舍去。
所以 A(x)F(x)−12=−√14−A(x),化简以后得到:
F(x)=21+√1−4A(x)
多项式开根求逆即可。
-
Luogu P4389付公主的背包
多项式优化完全背包
设物品体积为 v ,那么该物品的生成函数为 ∑i≥0[i%v=0]xi,也就是 11−xv。
答案就是 m 个生成函数的卷积。但是这样的复杂度还不如DP,所以需要优化。
考虑将乘法化为加法。一种常见的方法是求 ln 再 exp。
由 ln(1−A(x))=−∑i≥1Ai(x)i可得:
ln(1−xv)=−∑i≥1xvii
我们只需要枚举 v×i,根据调和级数,复杂度是 O(mlnm)。
枚举每一种物品,分别加到对应的系数中,就完成了取 ln 和求和的操作,然后求 exp 再求逆即可。
-
Luogu P4841城市规划
这题有一个比较巧妙(省事)的做法。
设多项式 fi 表示 i 个点的无向连通图个数 /i! ,则答案为 fn×n!。
设多项式 gi 表示 i 个点的无向图个数 /i!,不难发现 gi=2(n2)i!。
再考虑 g 和 f 的关系,因为一个无向图可以看作是由若干个无向连通图拼在一起的,所以我们枚举连通块的数量:
g=∞∑k=0fkk!
为什么要除以 k! 呢,因为我们再计算 f 与 g 时通过除以阶乘消除了标号的影响,而 fk 所乘的 k 个元素是有先后顺序的,所以要除以全排列来消除标号。
通过观察,上面的式子可以化为:
g=ef
即:
f=lng
这个转化在 cgz 的课件上可以找到。
-
Luogu P4451整数的lqp拆分
首先,斐波那契数列 f(x) 的生成函数为:
F(x)=x1−x−x2
令答案为 g(n),考虑枚举最后一个数字,在原来的基础上乘以该数的斐波那契值,即:
g(n)={∑ni=0f(i)∗g(n−i)(n≠0)1(n=0)
设其生成函数为 G(x),则有:
G=G∗F+1G=1−x−x21−2x−x2G=1+x1−2x−x2
只需要展开 −xx2+2x−1 即可。
我们知道 11−A(X)=∑i≥0Ai(x)xi,所以我们想把式子往这上面靠。
先解出 x2+2x−1=0 的两根 x1,x2,那么:
−xx2+2x−1=−x(x−x1)(x−x2)=xx2−x1(1x−x1−1x−x2)=xx2−x1(1x2×11−x/x2−1x1×11−x/x1)=1x2−x1(∑i=0xi+1xi+12−∑i=0xi+1xi+11)
所以第 n 项的系数 g(n)=1x2−x1×(1xn2−1xn1)。
带入得到:g(n)=√24[(1+√2)n−(1−√2)n]。
至于如何求 √2 在模 1e9+7 下的值,要用到二次剩余,具体可以看 这篇博客,这里给出参考值:59713600。
由于 n 很大,需要用到扩展欧拉定理,在读入时对 P−1 即 1e9+6 取模。
-
HAOI2018 染色
要用到 二项式反演 相关知识。
设 G(k) 表示恰好 k 中颜色出现了 S 次的方案数。
对于这一类问题,我们可以考虑钦定 k 种颜色,每种强行染色 S 次,剩下的随便染,即:
(mk)∗n!(S!)k(n−S×k)!∗(m−k)n−S×k
但是这个东西并不是 G,因为这会重复计数。比如,当我们钦定 a,b 两种颜色的时候,可能还有一种颜色 c 也正好出现了 S 次(因为剩下的是随便选的)。因此,我们令上式为 F(k),考虑 F 与 G 的关系。
我们发现,当 F 取 k,G 取 i 时,恰好有 (ik) 种情况 G 会对 F 造成贡献,所以可以得到:
F(k)=n∑i=k(ik)G(i)
已知 F 求 G,于是套用二项式反演得到:
G(k)=n∑i=k(−1)i−k(ik)F(i)
拆开组合数:
G(k)=n∑i=k(−1)i−ki!k!(i−k)!F(i)G(k)=1k!n∑i=k(−1)i−k(i−k)!i!F(i)
把 F 翻转一下就可以卷积了!
实现起来细节还是蛮多的……
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· C# 中比较实用的关键字,基础高频面试题!
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!
· 【译】Visual Studio(v17.13)中新的调试和分析特性