看到题解区没有用纯生成函数推导的做法,第一天学会基础 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);
标签:frac,limits,text,sum,ge,大病,2h,EGF,Mod
From: https://www.cnblogs.com/petitsouris/p/18100483