实验结果:第一次接触 EGF 的小孩在 2h 后大病发作

看到题解区没有用纯生成函数推导的做法,第一天学会基础 GF 的小朋友突发奇想,看看能不能用 GF,不用 min - max 容斥解决问题。

(笔者水平很低,因此叙述可能会较为繁琐,见谅)

首先有一个愚蠢的想法:考虑枚举次数 \(k\),计算恰好 \(k\) 次结束的概率。对于一个 \(k\),我们需要枚举最后一次出现的元素 \(i\),那么对于前 \(k-1\) 次,需要选出除了 \(i\) 以外的元素各至少一个,因此对于剩下的元素 EGF 应该为:

\[\prod\limits_{j\neq i}(\text{e}^{\frac{c_j}{N}x}-1) \]

\(-1\) 是减去空集,总的 EGF 是各个独立集合的 EGF 相乘)

那么要计算的答案就是:

\[\sum\limits_{k\ge 0}k[\frac{x^k}{k!}]\prod\limits_{i=1}^{M}\frac{c_i}{N}\prod\limits_{j\neq i}(\text{e}^{\frac{c_j}{N}x}-1) \]

这个式子或许可以通过你在做乘法的时候多加一维 \(0/1\) 记录有没有选到 \(i\) 来解决,但是这太唐了。

考虑一个不唐的做法:

我们不用 \(E(X)=\sum\limits_{k}k\times P(X=k)\) 来计算了,我们考虑 \(E(X)=\sum\limits_{k}P(X>k)\)(这点的正确性是显然的,考察每个 \(k\) 被计算的次数),也即 \(\sum\limits_{k}1-P(X\le k)\)

\(P(X\le k)\) 这件事情是极容易刻画的:这就是随出 \(k\) 个元素,每种元素都出现至少一次的概率。

因此答案可以被表示为:

\[\sum\limits_{k\ge 0}1-[\frac{x^k}{k!}]\prod\limits_{i=1}^{M}(\text{e}^{\frac{c_i}{N}x}-1) \]

不难发现,后面那个乘积式里的东西一定可以被表示成 \(\sum\limits_{i\le N}a_i\text{e}^{\frac{i}{N}x}\) 的形式。

我们先不考虑怎么求得 \(a\) 序列,假设已经得知了 \(a\) 序列,那么答案即为:

\[\sum\limits_{k\ge 0}1-[\frac{x^k}{k!}]\sum\limits_{i\le N}a_i\text{e}^{\frac{i}{N}x} \]

这个 \(1\) 放在前面难以处理,因为如果我们只对后面这部分单独独立,前面这个 \(1\) 一求和就会得到一个发散的东西,这与我们的目的背道而驰。但是我们发现一件很牛的事情:当 \(i=N\) 的时候,后面这个系数的值必定为 \(1\)!那我们不妨把这两个东西抵消掉,得到:

\[-\sum\limits_{k\ge 0}[\frac{x^k}{k!}]\sum\limits_{i<N}a_i\text{e}^{\frac{i}{N}x} \]

考察 \([\frac{x^k}{k!}]a_i\text{e}^{\frac{i}{N}x}\) 的值:\(a_i\text{e}^{\frac{i}{N}x}=\sum\limits _{n\ge 0}\frac{a_i(\frac{i}{N})^nx^n}{n!}\),因此 \([\frac{x^k}{k!}]a_i\text{e}^{\frac{i}{N}x}=a_i(\frac{i}{N})^k\)

因此答案为:

\[-\sum\limits_{k\ge 0}\sum\limits_{i<N}a_i(\frac{i}{N})^k \]

交换求和号:

\[-\sum\limits_{i<N}a_i\sum\limits_{k\ge 0}(\frac{i}{N})^k \]

后面那个和式运用几何级数求和处理:

\[-\sum\limits_{i<N}a_i\frac{1}{1-\frac{i}{N}} \]

做完了!最后就是这样一个简洁的结果。

现在还有一个历史遗留问题:如何求 \(a_i\)?我们的目标即为求出

\[\prod\limits_{i=1}^{M}(\text{e}^{\frac{c_i}{N}x}-1) \]

的各项系数。

先换个元,设 \(t=\text{e}^{\frac{1}{N}x}\),那么现在要求的就是

\[\prod\limits_{i=1}^{M}(t^{c_i}-1) \]

一个简单的做法是分治 NTT / 启发式合并 NTT,时间复杂度 \(\mathcal O(N\log ^2 N)\)

还有一种复杂度更优的做法,考虑先 \(\ln\)\(\exp\),即

\[(-1)^M\exp(\sum\limits_{i=1}^{M}\ln(1-t^{c_i})) \]

(这里把 \(-1\) 提出来了)然后考虑 \(\ln(1-x)=-\sum\limits_{n\ge 1}\frac{x^n}{n}\),因此得到:

\[(-1)^M\exp(\sum\limits_{i=1}^{M}\sum\limits_{j=1}^{N/c_i}-\frac{t^{c_ij}}{j}) \]

现在就可以计算了:对于每种不同的 \(c_i\) 枚举 \(j\),时间复杂度调和级数 \(\mathcal O(N\log N)\),然后做一次多项式 exp,时间复杂度 \(\mathcal O(N\log N)\)

事实上,比对后发现得到的结果和 min - max 容斥得到的结果一致,可以认为这是推导 min - max 容斥的一种途径。

代码片段:

n=read(),m=read();
rep(i,1,m)a[i]=read(),bin[a[i]]++;
Init(n+1);
rep(i,1,n){
	rep(j,1,n){
		if(i*j>n)break;
		f[i*j]=(f[i*j]-bin[i]*inv[j]%Mod+Mod)%Mod;
	}
}
f=Exp(n+1,f);
if(m&1){
	rep(i,0,n)f[i]=(Mod-f[i])%Mod;
}
ll ans=0;
rep(i,0,n-1)ans=(ans+f[i]*n%Mod*inv[n-i])%Mod;
write((Mod-ans)%Mod);
posted @ 2024-03-27 22:35  PetitSouris  阅读(49)  评论(0)    收藏  举报