生成函数做题笔记

  • Luogu P2000拯救世界

    生成函数的入门题,对于每一个限制条件,若为 k 的倍数则生成函数为 11xk,若为 k 则为 1xk+11x。最后用广义二项式定理求出第 n 项系数即可。

  • CF438E The Child and Binary Tree

    fi 表示权值和为 i 的方案数,记 ai 为权值 i 的出现次数,则:

    fi={1i=0j+p+q=iajfpfqi1

    A(x)=i=1maixifiOGFF(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=14A(x)

    A(x)F(x)12=14A(x)14A(x) 的零次项为 14,存在逆元),那么:A(x)F(x)=14A(x)+12。但是,右式是零次项为 1,但是左边的零次项为 0,所以舍去。

    所以 A(x)F(x)12=14A(x),化简以后得到:

    F(x)=21+14A(x)

    多项式开根求逆即可。

  • Luogu P4389付公主的背包

    多项式优化完全背包

    设物品体积为 v ,那么该物品的生成函数为 i0[i%v=0]xi,也就是 11xv

    答案就是 m 个生成函数的卷积。但是这样的复杂度还不如DP,所以需要优化。

    考虑将乘法化为加法。一种常见的方法是求 lnexp

    ln(1A(x))=i1Ai(x)i可得:

    ln(1xv=i1xvii

    我们只需要枚举 v×i,根据调和级数,复杂度是 O(mlnm)

    枚举每一种物品,分别加到对应的系数中,就完成了取 ln 和求和的操作,然后求 exp 再求逆即可。

  • Luogu P4841城市规划

    这题有一个比较巧妙(省事)的做法。

    设多项式 fi 表示 i 个点的无向连通图个数 /i! ,则答案为 fn×n!

    设多项式 gi 表示 i 个点的无向图个数 /i!,不难发现 gi=2(n2)i!

    再考虑 gf 的关系,因为一个无向图可以看作是由若干个无向连通图拼在一起的,所以我们枚举连通块的数量:

    g=k=0fkk!

    为什么要除以 k! 呢,因为我们再计算 fg 时通过除以阶乘消除了标号的影响,而 fk 所乘的 k 个元素是有先后顺序的,所以要除以全排列来消除标号。

    通过观察,上面的式子可以化为:

    g=ef

    即:

    f=lng

    这个转化在 cgz 的课件上可以找到。

  • Luogu P4451整数的lqp拆分

    首先,斐波那契数列 f(x) 的生成函数为:

    F(x)=x1xx2

    令答案为 g(n),考虑枚举最后一个数字,在原来的基础上乘以该数的斐波那契值,即:

    g(n)={i=0nf(i)g(ni)(n0)1(n=0)

    设其生成函数为 G(x),则有:

    G=GF+1G=1xx212xx2G=1+x12xx2

    只需要展开 xx2+2x1 即可。

    我们知道 11A(X)=i0Ai(x)xi,所以我们想把式子往这上面靠。

    先解出 x2+2x1=0 的两根 x1,x2,那么:

    xx2+2x1=x(xx1)(xx2)=xx2x1(1xx11xx2)=xx2x1(1x2×11x/x21x1×11x/x1)=1x2x1(i=0xi+1x2i+1i=0xi+1x1i+1)

    所以第 n 项的系数 g(n)=1x2x1×(1x2n1x1n)

    带入得到:g(n)=24[(1+2)n(12)n]

    至于如何求 2 在模 1e9+7 下的值,要用到二次剩余,具体可以看 这篇博客,这里给出参考值:59713600

    由于 n 很大,需要用到扩展欧拉定理,在读入时对 P11e9+6 取模。

  • HAOI2018 染色

    要用到 二项式反演 相关知识。

    G(k) 表示恰好 k 中颜色出现了 S 次的方案数。

    对于这一类问题,我们可以考虑钦定 k 种颜色,每种强行染色 S 次,剩下的随便染,即:

    (mk)n!(S!)k(nS×k)!(mk)nS×k

    但是这个东西并不是 G,因为这会重复计数。比如,当我们钦定 a,b 两种颜色的时候,可能还有一种颜色 c 也正好出现了 S 次(因为剩下的是随便选的)。因此,我们令上式为 F(k),考虑 FG 的关系。

    我们发现,当 FkGi 时,恰好有 (ik) 种情况 G 会对 F 造成贡献,所以可以得到:

    F(k)=i=kn(ik)G(i)

    已知 FG,于是套用二项式反演得到:

    G(k)=i=kn(1)ik(ik)F(i)

    拆开组合数:

    G(k)=i=kn(1)iki!k!(ik)!F(i)G(k)=1k!i=kn(1)ik(ik)!i!F(i)

    F 翻转一下就可以卷积了!

    实现起来细节还是蛮多的……

posted @   When_C  阅读(134)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
阅读排行:
· C# 中比较实用的关键字,基础高频面试题!
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!
· 【译】Visual Studio(v17.13)中新的调试和分析特性
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起