生成函数的blogs:https://rqy.moe/Math/gf_correct/
0.一堆dp:https://www.cnblogs.com/Lrefrain/p/12123541.html
1.UOJ 208 UOIP十合一
问你某张图有多少个边集中不存在环。
1.DAG
2.多个边数很少的连通块
3.多个连通块,且其中仅含有一个环
4.分层图,每一层仅有4个点
5.多个强连通分量,每个中的边数很少
6.完全图
7.8 n很小的有向图
1.DAG
除了重边之外的所有边的个数为c。
答案为:ans=2c
2.多个边数很少的连通块
连通块中暴力枚举边集暴力判断,然后各个连通块的答案乘起来就可以了。
3.多个连通块,且其中仅含有一个环
找到每个连通块中的环,然后环上的边不能全选,再乘上剩下所有的边的方案就可以了。
4.分层图,每一层仅有4个点
状压连通性。
dp[S]为联通状态为S的方案。
然后枚举两层之间的边集判断+转移即可。
5.多个强连通分量,每个中的边数很少
和2差不多。
桥就直接乘2即可。
6.完全图
设dp[i]为i个点的DAG生成数目。
那么得到递推:
dp[i]=\sum\limits_{j=1}^{i}\binom{i}{j}(-1)^{j-1}dp[i-j]2^{j(i-j)}
和主旋律那个题一样,在枚举最后一层来转移。
7.8 n很小的有向图
这个就是有向图DAG计数,巨神兵的原题了。
dp[S]为S中的DAG生成个数,w[S\rightarrow T]点集S向点集T中的边的个数。
那么转移有:
dp[S]=\sum\limits_{T\subseteq S}(-1)^{|T|-1}dp[S-T]2^{w[T\rightarrow S-T]}
在解释一次的话就是说这个容斥的意思是把不同顺序的方案容斥成一个。
2.UOJ 449 喂鸽子
好题。
看一眼就知道是Min\_Max容斥是吧。
然后考虑该怎么做。
设Min(i)为喂i只鸽子最先喂饱一只的期望时间。
我们要求的答案数组为:Max(i),喂i只格子最后喂饱那只的期望时间。
那么直接用Min\_Max容斥得到:
Max(n)=\sum\limits_{i=1}^{n}(-1)^{i-1}\binom{n}{i}Min(i)
相当于合并了子集形式的贡献,因为容斥系数都是一样的。
假设我们只喂i只鸽子的话,最先喂饱某一只的期望时间是f(i)。
那么:
Min(i)=\frac{n}{i}f(i)
这样我们求出f(i)即可。
假设某只鸽子第一个吃饱,那么他一定吃了K次。
设一个生成函数,表示没有鸽子吃饱的情况下,所有的鸽子吃了某个个数的玉米粒的方案:
G(x)=\sum\limits_{i=0}^{K-1}\frac{x^i}{i!}
一个指数生成函数,表示的意思是一只鸽子吃的玉米粒个数为i的方案,因为每只鸽子各不相同,所以是指数型生成函数。
多只鸽子的话直接乘起来就行了。
我们枚举其他鸽子吃的个数来求f(i):
f(i)=i\sum\limits_{j=1}^{+\infty}\binom{j+K-1}{j}(j+k)[x^j]G^{i-1}(x)\frac{1}{i^{j+k}}
这个是一个用方案算概率的形式求期望。
总方案是\frac{1}{i^{j+k}}
然后插板出除了最后一个玉米的方案是\binom{j+K-1}{j}。
同时对于这j个玉米的分配则有:[x^j]G^{i-1}(x),表示除了吃饱了的那只鸽子,剩下的i-1只鸽子吃了j个玉米粒的方案。
然后最后不一定是哪一只吃饱了。
所以乘i,鸽子个数。
这样直接用多项式乘法就行了,复杂度是:O(n^2Klog(nK))
然后还有一种O(nK)的做法。
很神仙的dp。
把题解直接粘过来了。



3.UOJ 450 复读机
不错。
单位根反演当补个盲区,生成函数也很不错。
观察数据范围发现是测试点分治。
d=1,ans=k^n
d=2
用生成函数egf搞一搞。
一个复读机的生成函数就是:
G(x)=\sum\limits_{i=0}^{+\infty}[2|i]\frac{x^i}{i!}
那么答案就是:
\begin{aligned}
ans&=[x^n]G^k(x)\\
\frac{e^x+e^{-x}}{2}&=\sum\limits_{i=0}^{+\infty}\frac{x^i+(-1)^ix^i}{2i!}\\
&=\sum\limits_{i=0}^{+\infty}[2|i]\frac{x^i}{i!}\\
ans&=[x^n](\frac{e^x+e^{-x}}{2})^k\\
&=\sum\limits_{i=0}^{k}\binom{k}{i}[x^n]e^{(2i-k)x}\\
&=\sum\limits_{i=0}^{k}\binom{k}{i}(2i-k)^n\\
\end{aligned}
这样就可以O(K)的算了。
d=3
仍然用生成函数搞一搞。
G(x)=\sum\limits_{i=0}^{+\infty}[3|i]\frac{x^i}{i!}
先撇开不管。
引入单位根反演:
https://www.cnblogs.com/Lrefrain/p/12285098.html
OK。现在会单位根反演了。
那么答案就是:
\begin{aligned}
ans&=[x^n]G^k(x)\\
&=[x^n](\frac{1}{3}\sum\limits_{i=0}^{+\infty}\frac{x^i}{i!}(\sum\limits_{j=0}^{2}w_3^{ij}))^k\\
&=[x^n](\frac{1}{3}\sum\limits_{i=0}^{+\infty}\frac{(w_3^0x)^i+(w_3^1x)^i+(w_3^2x)^i}{i!})^k\\
&=[x^n](\frac{1}{3}(e^{w_3^0x}+e^{w_3^1x}+e^{w_3^2x}))^k\\
&=\sum\limits_{i=0}^{k}\binom{k}{i}[x^n]e^{x(k-i)}\sum\limits_{j=0}^{i}\binom{i}{j}[x^n]e^{jw_3^1x}[x^n]e^{(i-j)w_3^2x}\\
&=\sum\limits_{i=0}^{k}\sum\limits_{j=0}^{i}\binom{k}{i}\binom{i}{j}(x(k-i)+jw_3^1+(i-j)w_3^2)^n\\
\end{aligned}
直接k^2暴力算就可以了。
然后单位根的话,取模意义下就用原根来做。
这里3|phi,所以w_3^1=g^{\frac{phi}{3}}
然后就解决了。
4.LOJ 咱们去烧菜吧
是我之前不会的那种背包。(现在会了)
要求对不同的背包容量做混合背包。
设G(x)为答案的生成函数,我们首先可以列出这样的式子:
G(x)=\prod\limits_{i=1}^{m}\sum\limits_{j=0}^{b_i}(x^{a_i})^j
然后加一点级数求和,可以直接推式子了。
\begin{aligned}
G(x)&=\prod\limits_{i=1}^{m}\left(\frac{1-x^{a_i(b_i+1)}}{1-x^{a_i}}\right)\\
&=exp\left(ln\left(\prod\limits_{i=1}^{m}\left(\frac{1-x^{a_i(b_i+1)}}{1-x^{a_i}}\right)\right)\right)\\
&=exp\left(\sum\limits_{i=1}^{m}\left(ln(\frac{1-x^{a_i(b_i+1)}}{1-x^{a_i}})\right)\right)\\
&=exp\left(\sum\limits_{i=1}^{m}ln(1-x^{a_i(b_i+1)})-ln(1-x^{a_i})\right)\\
&=exp\left(\sum\limits_{i=1}^{m}\sum\limits_{j=1}^{+\infty}\frac{x^{a_ij}-x^{a_i(b_i+1)j}}{j}\right)\\
w_i&=\sum\limits_{j=1}^{m}[a_j=i]-[a_j(b_j+1)=i]\\
W(x)&=\sum\limits_{i=0}^{n}w_ix^i\\
G(x)&=exp\left(\sum\limits_{j=1}^{n}\frac{1}{j}\sum\limits_{i=1}^{n}w_ix^{ij}\right)\\
&=exp\left(\sum\limits_{j=1}^{n}\frac{1}{j}W(x^j)\right)\\
\end{aligned}
然后O(nln n)预处理一下就可以直接上exp了。
复杂度是O(nln n+nlogn)。
5.LOJ 6358 前夕
还是单位根反演。
(发现套路了就是整除计数不是莫比乌斯就是单位根反演)
设n个数一定被选其他数不一定被选的方案是:
g(i)=\binom{n}{i}(2^{2^{n-i}}-1)
然后构造容斥系数f(i)使得:
ans=\sum\limits_{i=0}^{n}f(i)g(i)
那么对于一个恰好选了i个方案来说。
他被这种计数方式记录的次数应当满足的条件为:
[4|i]=\sum\limits_{j=0}^{i}\binom{i}{j}f(j)
二项式反演一下:
f(i)=\sum\limits_{j=0}^{i}(-1)^{i-j}\binom{i}{j}[4|j]
然后单位根反演一下,改变枚举顺序并二项式定理合起来:
\begin{aligned}
f(i)&=\sum\limits_{j=0}^{i}(-1)^{i-j}\binom{i}{j}\frac{1}{4}\sum\limits_{k=0}^{3}w_4^{jk}\\
&=\frac{1}{4}\sum\limits_{k=0}^{3}\sum\limits_{j=0}^{i}(-1)^{i-j}\binom{i}{j}(w_4^{k})^j\\
&=\frac{1}{4}\sum\limits_{k=0}^{3}(w_{4}^{k}-1)^i\\
\end{aligned}
然后回代就可以算了。
这样复杂度是线性的,但是容易被卡常。
6.小朋友与二叉树
设一个点的生成函数为:
G(x)=\sum\limits_{i\in S}x^i
设权值和大小为i的方案数f_i的生成函数为:
F(x)=\sum\limits_{i=0}^{+\infty}f_ix^i
那么有:
f_i=\sum\limits_{j,k}f_jf_k[(i-j-k)\in S]
这样的话就是说:
F(x)=F^2(x)G(x)+1
解得:
F(x)=\frac{1\pm\sqrt{1-4G(x)}}{2G(x)}
然后发现如果是减法的话,等式的常数项必然为0,不是正解舍去。
那么:
F(x)=\frac{1+\sqrt{1-4G(x)}}{2G(x)}
7.某集训队作业题
对于集合S,定义w(S)=\prod\limits_{x\in S}x。
定义F(n,k)=\sum\limits_{S\subseteq [n],|S|=k}w(S)。
对于给定的质数P,对于\forall i\in[0,P-1],求存在多少个k\in[0,n],满足F(n,k)\equiv i(mod\ P)
n\leq 10^{18},p\leq 10^5
神仙题。
设G_n(x)为F(n,k)的生成函数。
也就是说:
G_n(x)=\sum\limits_{i=0}^{+\infty}F(n,i)x^i
F(n,k)=F(n-1,k-1)n+F(n-1,k)
等价于:
G_n(x)=nxG_{n-1}(x)+G_{n-1}(x)=(nx+1)G_{n-1}(x)
也就是说:
G_{n}(x)=\prod\limits_{i=1}^{n}(ix+1)
把系数转置一下:
G_{n}(x)=\prod\limits_{i=1}^{n}(x+i)
设n=ap+b
那么:
G_{n}(x)=\left(\prod\limits_{i=0}^{p-1}(x+i)\right)^a\left(\prod\limits_{i=1}^{b}(x+i)\right)
考虑前面这一部分:
\prod\limits_{i=0}^{p-1}(x+i)
也就是说,要求一个式子和这个式子一样,使得其再mod\ p意义下的解集是[0,p-1]。
费马小定理。
x\prod\limits_{i=1}^{p-1}(x+i)\equiv x^{p}-x(mod\ p)
然后求后半部分。
发现可以直接倍增来搞。
前面的部分并不好统计,是这样的形式的(y-1)^a。
但是a很大。
先用二项式定理展开一下:
(y-1)^a=\sum\limits_{i=0}^{a}\binom{a}{i}y^i(-1)^{a-i}
然后这个组合数尝试代入卢卡斯定理。
\begin{aligned}
(y-1)^a&=\sum\limits_{i=0}^{a}\prod\limits_{j=1}^{log_pa}\binom{a_j}{i_j}y^{i_jp^j}(-1)^{(a_j-i_j)p^j}\\
&=\prod\limits_{j=1}^{log_pa}\sum\limits_{i_j=0}^{p-1}\binom{a_j}{i_j}y^{i_jp^j}(-1)^{(a_j-i_j)p^j}\\
\end{aligned}
这样就变成log_pa个多项式相乘了。
我们可以直接用卷积统计系数分布。
8.概率论
本质不同二叉树个数是卡特兰数g_n。
相当于是考虑左右孩子的大小。
g_n=\sum\limits_{i=0}^{n-1}g_ig_{n-i-1}
这是卡特兰数的定义式。
设n个点所有方案下含有的叶子数目的和为f_n。
f_n=\sum\limits_{i=0}^{n-1}f_ig_{n-i-1}+g_{i}f_{n-i-1}
设生成函数分别为F(x),G(x)。
那么就是说:
F(x)=2xF(x)G(x)+x
最后的+x是考虑当前这个点就是叶子的情况。
卡特兰数的通项公式是G(x)=\frac{1-\sqrt{1-4x}}{2x}。
那么:
F(x)=2xF(x)G(x)+x
然后解得:F(x)=x(G(x))'
也就是说f_n=ng_{n-1}
所以答案就是:
ans=\frac{ng_{n-1}}{g_n}
直接代入卡特兰数即可:
ans=\frac{n^2+n}{4n-2}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具