[NOI 2025] 集合题解

数学分析好题,这道题拯救了我的 NOI。

写一下赛时做法。

B 性质

把二进制数视作集合,设 \(U=\{1, 2, \dots, n\}, S=\mathcal{P}(U)\)\(U\) 的幂集)。

定义 \(v(P)=\prod_{x\in P}a_x\)

首先枚举 \(J\subseteq U\),然后计算 \(f(P_1)=f(P_2)=J\) 的有序对的贡献,即

\[\sum_{J\subseteq U}\sum_{P_1\subseteq S, f(P_1)=J}v(P_1)\sum_{P_2\subseteq S, f(P_2)=J, P_1\cap P_2=\varnothing}v(P_2) \]

熟知困难计数题优先考虑容斥,注意到

\[\sum_{P\subseteq S, f(P)=J}v(P)=\sum_{J\subseteq T\subseteq U}(-1)^{|T|-|J|}\sum_{P\subseteq S, T\subseteq f(P)}v(P) \]

所以原式等于

\[\sum_{T_1, T_2\subseteq U}(-1)^{|T_1|+|T_2|}\sum_{J\subseteq (T_1\cap T_2)}\sum_{T_1\subseteq f(P_1), T_2\subseteq f(P_2), P_1\cap P_2=\varnothing}v(P_1)v(P_2) \]

发现枚举 \(J\) 可以替换为 \(2^{|T_1\cap T_2|}\),即

\[\sum_{T_1, T_2\subseteq U}(-1)^{|T_1|+|T_2|}2^{|T_1\cap T_2|}\sum_{T_1\subseteq f(P_1), T_2\subseteq f(P_2), P_1\cap P_2=\varnothing}v(P_1)v(P_2) \tag{1} \]

\(A=\{X|X\subseteq U, T_1\subseteq X\}, B=\{X|X\subseteq U, T_2\subseteq X\}\)。那么 \((1)\) 式右侧和号下的条件 \(T_1\subseteq f(P_1), T_2\subseteq f(P_2)\) 等价于 \(P_1\subseteq A, P_2\subseteq B\)

\((1)\) 等于

\[\sum_{T_1, T_2\subseteq U}(-1)^{|T_1|+|T_2|}2^{|T_1\cap T_2|}\sum_{P_1\subseteq A, P_2\subseteq B, P_1\cap P_2=\varnothing}\prod_{X\in P_1\cup P_2}a_X=\sum_{T_1, T_2\subseteq U}(-1)^{|T_1|+|T_2|}2^{|T_1\cap T_2|}\prod_{X\in (A\cap B)}(2a_X+1)\prod_{X\in (A\cup B)/(A\cap B)}(a_X+1) \]

第二个等号的原理:考虑把所有括号展开,对于 \(X\in(A\cap B)\)每一项都要从 \(2a_X\)\(1\) 中选择一个,选择 \(1\) 表示 \(X\) 既不在 \(P_1\) 中也不在 \(P_2\) 中,选择 \(2a_X\) 表示在其中一个。(乘以 \(2\) 是因为有在 \(P_1\) 中和在 \(P_2\) 中两种可能)

而对于 \(X\in (A\cup B)/(A\cap B)\),选择 \(1\) 表示 \(X\) 不在 \(P_1, P_2\) 中,否则表示在其中。这里不乘以二是因为 \(X\notin (A\cap B)\),只能放在其中一个里。

那么只需要预处理 \(G(T)=\prod_{T\subseteq X}(2a_X+1), K(T)=\prod_{T\subseteq X}(a_X+1)\)(显然它们能在 \(O(n2^n)\) 内预处理出),答案就是

\[\sum_{T_1, T_2\subseteq U}(-1)^{|T_1|+|T_2|}2^{|T_1\cap T_2|}G(T_1\cup T_2)\times\dfrac{K(T_1)K(T_2)}{K(T_1\cup T_2)^2} \]

为了进一步地简化式子,另设 \(L(T)=\dfrac{G(T)}{K(T)^22^{|T|}},W(T)=K(T)(-2)^{|T|}\),原式等于

\[\sum_{T_1, T_2\subseteq U}W(T_1)W(T_2)L(T_1\cup T_2)=\sum_{T\subseteq U}L(T)\sum_{T_1\cup T_2=T}W(T_1)W(T_2) \]

这是一个卷积的形式,使用 FWT 直接 \(O(n2^n)\) 计算。

正解

设使用之前的算法算出的答案为 \(ans(a_0, a_1\dots, a_U)\)(注意他是一个 \(2^n\) 元的函数)。

考虑它在 \(a_X=998244352\) 时遇到了问题,因为可能出现乘以 \(0\) 再除以 \(0\) 的情况。

为了解决这个问题,注意 \(\lim_{\epsilon\to 0^+}ans(a_0+\epsilon, a_1+\epsilon, \dots, a_U+\epsilon)\) 就是正确的答案(注意所有 \(a_X\) 都加上 \(\epsilon\) 后,就不会出现除以 \(0\) 的情况,只会出现除以 \(\epsilon\) 的情况)。

一个想法是直接把 \(\epsilon\) 带进去 \(ans\) 的表达式中计算,这样原本的每一个数都是一个关于 \(\epsilon\) 的洛朗级数,但是洛朗级数的乘除法很慢。

因此,我们的办法是任何时候只保留洛朗级数的最低项,这样复杂度不变,并且算出来的极限值是正确的。

证明:设想有一个洛朗级数\(3\epsilon^4+2\epsilon^2\),如果舍弃了 \(3\epsilon^4\) 对答案产生的影响,那么说明这个多项式一定会除以\((\text{常数}\times\epsilon^4)\) 后贡献到答案上,但这意味着 \(2\epsilon^2\) 变成了 \(\text{常数}\times \dfrac{1}{\epsilon^2}\),这意味着极限发散!原极限显然是存在的,这不可能。

在具体计算时,如果是加法,并且最低次项次数相同则系数相加,否则只保留低次项。如果是乘/除法,直接让最低次项做乘/除法。

那么通过这个方法算出来的 \(ans(a_0+\epsilon, a_1+\epsilon, \dots, a_U+\epsilon)\),它的常数项就是答案。(带 \(\epsilon\) 的项都趋于 \(0\),可不计)

posted @ 2025-07-16 20:32  yanzihe  阅读(133)  评论(0)    收藏  举报