ZR 2025 十一集训 Day 2

怎么这么困难。跳过了一些过难的题。


上标前缀和

哦原来真的有这个东西,记得马蹄杯被这个硬控了不短时间来着。

公式:

\[\sum _{i=0} ^n \binom i m = \binom {n+1} {m+1} \]

证明也是容易的,考虑组合意义。在 \(n+1\) 个小球中选 \(m\) 个,可以枚举选择的最后一个小球的位置,于是就转化成了前面 \(i\) 个小球里选 \(m\) 个,而 \(i\) 的取值范围是 \(1 \sim n\),也就是左边的式子了。


多项式乘组合数求和

求:

\[\sum _{i=0} ^n f(i) \binom n i \]

其中 \(f(i)\) 是一个 \(m\) 次多项式。

  1. \(f(i)\) 拆开。

    \[\sum _{i=0} ^n \left( \sum _{j=0} ^m a_j i^j \right) \binom n i \]

  2. 交换求和顺序。

    \[\sum _{j=0} ^m a_j \sum _{i=0} ^n i^j \binom n i \]

  3. \(i^j\) 用斯特林数结论转为下降幂。

    \[\sum _{j=0} ^m a_j \sum _{i=0} ^n \left( \sum _{k=0} ^j \binom i k \begin{Bmatrix} j \\ k \end{Bmatrix} k! \right) \binom n i \]

  4. 交换求和顺序。

    \[\sum _{j=0} ^m a_j \sum _{k=0} ^j \begin{Bmatrix} j \\ k \end{Bmatrix} k! \sum _{i=0} ^n \binom i k \binom n i \]

  5. 用【前面忘了】组合数恒等式转化一下。

    \[\sum _{j=0} ^m a_j \sum _{k=0} ^j \begin{Bmatrix} j \\ k \end{Bmatrix} k! \sum _{i=0} ^n \binom n k \binom {n-k} {i-k} \]

  6. 把与 \(i\) 无关的项提取出来。

    \[\sum _{j=0} ^m a_j \sum _{k=0} ^j \begin{Bmatrix} j \\ k \end{Bmatrix} k! \binom n k \sum _{i=0} ^n \binom {n-k} {i-k} \]

  7. \(i-k\) 变成 \(i\)

    \[\sum _{j=0} ^m a_j \sum _{k=0} ^j \begin{Bmatrix} j \\ k \end{Bmatrix} k! \binom n k \sum _{i=0} ^{n-k} \binom {n-k} i \]

  8. 对最后一个 \(\sum\) 进行二项式定理(或者说杨辉三角行求和)。

    \[\sum _{j=0} ^m a_j \sum _{k=0} ^j \begin{Bmatrix} j \\ k \end{Bmatrix} k! \binom n k 2^{n-k} \]

  9. 把组合数拆开并与 \(k!\) 合并。同时提取 \(2^n\)

    \[2^n \sum _{j=0} ^m a_j \sum _{k=0} ^j \begin{Bmatrix} j \\ k \end{Bmatrix} \frac {n!} {(n-k)!} 2^{-k} \]

  10. 交换求和顺序(本质上就是对于一个三角形,将先枚举行变成先枚举列;可以先把 \(\sum\) 都放到前面理解,交换后在放回来)。

    \[2^n \sum _{k=0} ^m \frac {n!} {(n-k)!} 2^{-k} \sum _{j=k} ^m a_j \begin{Bmatrix} j \\ k \end{Bmatrix} \]

注意到 \(\frac {n!} {(n-k)!}\)(关于 \(n\))最高次为 \(m\) 次,所以上式除了 \(2^n\) 之外可以转化为一个关于 \(n\)\(m\) 次多项式 \(g(n)\),于是:

\[\sum _{i=0} ^n f(i) \binom n i = g(n) 2^n \]

对于 \(g(n)\),需要 \(O(m^2)\) 预处理斯特林数(直接递推),然后对于每个 \(k\),都可以用 \(O(m)\) 的复杂度求出 \(\frac {n!} {(n-k)!}\)\(n^x\) 累加的系数。所以可以在 \(O(m^2)\) 的时间复杂度内求出 \(g(n)\),而直接按照原始式子求是 \(O(nm)\) 的。

简化版:

\[\begin{aligned} & \sum _{i=0} ^n i \binom n i\\ = & \sum _{i=0} ^n i \cdot \frac {n!} {i! (n-i)!} \\ = & \sum _{i=0} ^n \frac {n!} {(i-1)! (n-i)!} \\ = & n \sum _{i=0} ^n \frac {(n-1)!} {(i-1)! (n-i)!} \\ = & n \sum _{i=0} ^n \binom {n-1} {i-1} \\ = & n \sum _{i=0} ^{n-1} \binom {n-1} i \\ = & n 2^{n-1} \end{aligned} \]

以及:

\[\sum _{i=0} ^n i^2 \binom n i = n (n+1) 2^{n-2} \]


洛谷 P7481

思维难度:\(\color{#52C41A} 绿\) *1800

快进(退?)到硬凑均值不等式的时代。

题意:给定 \(1 \le m \le 5000\)\(1 \le n \le 10^9\)\(m \le n\)\(\forall 1 \le a,b \le m\),求:

\[f(a,b) = \sum _{i=0} ^b \binom b i \binom {n-i} a \]

这是不好化简的,所以考虑能否递推解决。

哦对了,我们不用太关心 \(\sum\) 的上下界,因为不合法的位置会自动变成 \(0\),直接当成 \(\sum _{-\infin} ^{+\infin}\) 即可。

那么利用组合数递推式拆开得到:

\[\begin{aligned} & = \sum \left( \binom {b-1} i + \binom {b-1} {i-1} \right) \binom {n-i} a \\ & = \sum \binom {b-1} i \binom {n-i} a + \sum \binom {b-1} {i-1} \binom {n-i} a \\ & = f(a,b-1) + \sum\binom {b-1} {i-1} \binom {n-i} a \end{aligned} \]

后面式子中出现了一个 \(i-1\),考虑把 \(n-i\) 变成 \(n-i+1\) 来凑。

\[\begin{aligned} & = f(a,b-1) + \sum \binom {b-1} {i-1} \left( \binom {n-i+1} {a+1} - \binom {n-i} {a+1} \right) \\ & = f(a,b-1) + \sum \binom {b-1} {i-1} \binom {n-i+1} {a+1} - \sum \binom {b-1} {i-1} \binom {n-i} {a+1} \\ & = f(a,b-1) +f(a+1,b-1) - \sum \binom {b-1} {i-1} \binom {n-i} {a+1} \\ \end{aligned} \]

但是此时最后面那个式子又不能做了。不过发现如果 \(\binom {b-1} {i-1}\) 变回 \(\binom b i\) 的话就可以了。

所以回到原式,看看能不能通过一些容斥凑出来。

\[f(a,b) = \sum _{i=0} ^b \left( \binom {b-1} i ^{\color{#66CCFF} (1)} + \binom {b-1} {i-1} ^{\color{#66CCFF} (2)} \right) \left( \binom {n-i+1} {a+1} ^{\color{#66CCFF} (3)} - \binom {n-i} {a+1} ^{\color{#66CCFF} (4)} \right) \]

把这个式子分成了 \(4\) 部分,分别是一个二项式系数(从左往右)。

然后看看什么是能算的:

\[\begin{aligned} (1) \times ((3)-(4)) & = f(a,b-1) & (\rm i) \\ ((1)+(2)) \times (4) & = f(a+1,b) & (\rm ii) \\ (1) \times (4) & = f(a+1,b-1) & (\rm iii) \\ (2) \times (3) & = f(a+1,b-1) & (\rm iv) \end{aligned} \]

最终要求的是 \(((1)+(2)) \times ((3)-(4))\)

那么就简单了,随便凑一凑可得:

\[((1)+(2)) \times ((3)-(4)) = \rm (i) - (ii) + (iii) + (iv) \]

即:

\[f(a,b) = f(a,b-1) - f(a+1,b) + 2f(a+1,b-1) \]

submission

天依宝宝可爱!


LOJ 6300

思维难度:\(\color{#3498DB} 蓝\) *2500

难点在于转化,还有注意力,还有转化,还有转化,还有转化。

考虑最终得分会长什么样子,注意到可以表示成 \(n-m+k\) 的形式,其中 \(k\) 是分数为 \(0\) 时输的次数,\(k \ge 0\)

最麻烦的问题在于如何统计分数为 \(0\) 时输的次数。最关键的一步转化,将问题转化为格路计数,令沿 \(x\) 轴方向走为赢,沿 \(y\) 轴方向走为输,那么任意一种方案都可以双射到一条 \((0,0) \leadsto (n,m)\) 的路径上。可以参照最下面的图。

然后得分为 \(0\) 时输的情况,显然与当前位置的 \(x,y\) 坐标有关。具体地,若 \(k=1\),那么路径一定经过了直线 \(y = x+1\) 上的一个点,但是注意无论几次经过,都只会被统计一次,因为在一次之后分数已经变成了 \(x-y+1\) 而不是 \(x-y\)

进而,可以得出结论:若 \(k \ge k'\),那么路径一定经过了直线 \(y=x+k'\) 上的一个点。

根据经典结论,最终得分的期望 \(E(sco)\) 就是 \(\sum _{i=1} ^{+ \infin} P(sco \ge i)\),于是只需要对每个可能得分计算大于等于这个得分的概率即可,恰好对应了上面 \(k \ge k'\) 的结论。

而且得分至少为 \(n-m\),即 \(\forall 1 \le sco \le n-m : P(sco \ge i) = 1\),所以这一部分直接计入答案。那么只需要考虑 \(k > 0\) 的情况。

然后就只需要对于每个 \(k \ge 0\) 分别计算路径经过 \(y=x+k\) 的方案数即可,这个是经典问题(this 的洛谷 P3266),只需要把第一次经过 \(y=x+k\) 后面的点全都沿 \(y=x+k\) 翻折,每个经过 \(y=x+k\) 的方案就都可以双射到一个 \((0,0) \leadsto (m-k,n+k)\) 的路径上,其中 \((m-k,n+k)\)\((n,m)\) 关于 \(y=x+k\) 的对称点。方案数即为 \(\binom {n+m} {m-k}\),再除以总方案数 \(\binom {n+m} n\) 就是概率。

考虑 \(k\) 的上界,也就是只在得分为 \(0\) 的时候输,显然有 \(k \le m\)

于是 \(\sum _{i=1} ^{+ \infin} P(sco \ge i)\)(也就是所求期望)即为:

\[n-m + \frac 1 {\binom {n+m} n} \sum _{k=1} ^m \binom {n+m} {m-k} \]

但是注意一件事,当 \(m>n\) 时(上图),\(k \le m-n\) 的线一定会被经过,但是按照式子算就会出现概率 \(>1\) 的情况(例如上面的绿线),这是奇怪的,所以要避免。这也很简单,直接把 \(k \le m-n\) 的线砍掉,直接算为 \(1\) 即可。再与上面 \(1 \le sco \le n-m\) 的情况结合一下,发现加起来就变成了 \(0\)。整理一下有:

\[\max (n-m,0) + \frac 1 {\binom {n+m} n} \sum _{k = \max (m-n,0) +1} ^m \binom {n+m} {m-k} \]

继续整理,把组合数里的 \(m-k\) 化掉:

\[\max (n-m,0) + \frac 1 {\binom {n+m} n} \sum _{k=0} ^{m - (\max (m-n,0) +1)} \binom {n+m} {k} \]

已经化好了,但是如果闲的没事可以把 \(\sum\) 的上标稍微算一下:

\[\max (n-m,0) + \frac 1 {\binom {n+m} n} \sum _{k=0} ^{\min(n,m)-1} \binom {n+m} {k} \]

还没完,因为要多测且没有规定 \(\sum m\) 的大小。

观察数据范围,注意到 \(T \le 2.5 \times 10^5\),一个不同寻常的数字,通常出现在需要 sqrt-tech 的题目中。

那么把 \(T\) 换成 \(q\),似乎可以考虑莫队?

观察式子,发现最后一个 \(\sum\) 可以表示成 \(\sum _{i=0} ^m \binom n i\) 的形式,其中 \(m < n\)。这个又是经典问题(this),直接莫队做就好了。

具体地,莫队维护两个指针 \(l,r\) 表示 \(\sum _{i=0} ^l \binom r i\) 的值,那么:

  • \(l \gets l \pm 1\) 时,直接加或减上一个组合数即可。
  • \(r \gets r + 1\) 时,考虑画一个杨辉三角,可以发现答案即为 \(ans \gets 2ans - \binom r l\),此处的 \(r\) 为改变前的值。
  • \(r \gets r-1\) 时,把上面式子反过来就是了。

观察输入,发现还有个 \(p\) 没用到,不过确实没用,因为都规定输赢的次数了,那么输赢的概率就是不重要的了。有点诈骗的味道了。

submission

天依宝宝可爱!


洛谷 P4707 | min-max 容斥

思维难度:\(\color{#3498DB} 蓝\) *2200

套路地,定义 \(\min(S)\) 为第一次生成 \(S\) 中原料的期望时间,那么生成任意 \(k\) 种不同原料的期望时间就是 \(kth \min(S)\),注意到 \(n-k\) 很小所以想到可以转化成 \((n-k+1)th \max(S)\)

\(\dagger\) 此处的 \(\min\) 不是平常我们所说的「最小值」,而是一种特殊的定义(如上)。这篇题解里也讲了这个东西。

\(k’ = n-k+1\) 根据 min-max 容斥,有:

\[k'th \max(S) = \sum _{T \subseteq S \land T \ne \varnothing} (-1)^{|T|-k'} \binom {|T|-1} {k'-1} \min(T) \]

考虑 \(\min(T)\) 怎么算。发现这个是很容易的,因为一次生成有 \(\frac {\sum _{i \in T} p_i} m\) 的概率生成 \(T\) 中元素,所以期望就是 \(\frac m {\sum _{i \in T} p_i}\)

注意到 \(m\) 不大,所以可以考虑枚举 \(\sum _{i \in T} p_i\) 来算 \(\min(T)\)

然后我们还需要知道 \(|T|\) 就可以了。

显然可以 dp,令 \(f_{i,j,s}\) 为前 \(i\) 个元素,\(|T| = j\)\(\sum _{i \in T} p_i = s\)\(\sum _{T} (-1)^{|T|-k'} \binom {|T|-1} {k'-1}\),其中 \(\sum_T\) 需要保证 \(T\) 符合前面的要求。很容易写出转移方程:

\[f_{i,j,s} = f_{i-1,j,s} + f_{i-1,j-1,s-p_i} \]

但是这样是 \(O(n^2m)\) 的,而且是背包的形式故转移不好优化。

那么只能换状态。

首先 \(i\) 显然需要保留,\(s\) 因为要用于最后算 \(\min(T)\) 也要保留,所以只能考虑删掉 \(j\)

看看我们为什么需要 \(j\),就是为了算那个容斥系数。\((-1)^{|T| - k'}\) 可以在转移的时候乘 \(-1\) 解决;但是 \(\binom {|T|-1} {k'-1}\) 就不好办了,可能的方案是按照组合数递推式拆开,但是这样会出现 \(k’-2\) 这个东西,我们并没有关心过这个东西,而是把 \(k’\) 看作了定值。

继续观察,发现还有个 \(k' \le 11\) 的性质没用上啊!那么不如把 \(k’\) 丢到状态里?

于是令 \(f_{i,s,x}\) 为前 \(i\) 个元素,\(\sum _{i \in T} p_i = s\),选择的 \(k'\)\(x\) 所对应的 \(\sum _T (-1)^{|T|-x} \binom {|T|-1} {x-1}\)。转移考虑是否选第 \(i\) 个元素:

  • 若不选第 \(i\) 个元素,那么直接继承 \(i-1\) 的状态,有:

    \[f_{i,s,x} \gets f_{i-1,s,x} \]

  • 若选第 \(i\) 个元素,则固定 \(i\) 必须在 \(T\) 里面,然后考虑如何从 \(i-1\)\(T\) 转移过来(因为固定 \(i\) 在里面了,所以大小需要 \(+1\),因为我们的式子只关心大小,所以尽管是对于 \(i-1\)\(T\) 但这仍是合理的),首先前两维一定是 \(i-1,s-p_i\),于是只考虑第三维该是什么:

    \[\begin{aligned} & \sum _T (-1)^{|T|-x+1} \binom {|T|} {x-1} \\ = & \sum _T (-1)^{|T|-x+1} \left( \binom {|T|-1} {x-1} + \binom {|T|-1} {x-2} \right) \\ = & \sum _T (-1)^{|T|-x+1} \binom {|T|-1} {x-1} + \sum _T (-1)^{|T|-x+1} \binom {|T|-1} {x-2} \\ = & (-1) \sum _T (-1)^{|T|-x} \binom {|T|-1} {x-1} + \sum _T (-1)^{|T|-(x-1)} \binom {|T|-1} {(x-1)-1} \\ = & - f_{i-1,s-p_i,x} + f_{i-1,s-p_i,x-1} \end{aligned} \]

    很神奇的转移,巧妙地把 \(i\) 的状态通过固定元素 \(i\) 映射到了 \(i-1\) 的状态上。

    于是:

    \[f_{i,s,x} \gets - f_{i-1,s-p_i,x} + f_{i-1,s-p_i,x-1} \]

两部分加起来就是总转移方程了。即:

\[f_{i,s,x} = f_{i-1,s,x} - f_{i-1,s-p_i,x} + f_{i-1,s-p_i,x-1} \]

关于初始状态的争论挺多的,但其实完全没必要,不如麻烦一点直接把 \(i=1\) 当作初始状态就可以了。如果非得 \(i=0\) 的话就只能考虑逆推 dp 式子去凑了(或者据说可以通过下降幂定义的组合数即实数域组合数去做)。

欸,我不会说我其实去看了看下降幂然后按照这个写了的。

submission

天依宝宝可爱!


洛谷 P6620 | 第二类斯特林数

思维难度:\(\color{#FFC116} 黄\) *1300

简单推式子题。本质上就是最上面那个「多项式乘组合数求和」,多乘一个 \(x^k\) 不会带来多大的改变。

submission

天依宝宝可爱!


AT_arc118_e

思维难度:\(\color{#52C41A} 绿\) *1600

似乎并不是很难的题,想到容斥就做完了。

于是问题在于如何想到容斥。

就是发现直接做很困难(不过也不是不能做),但是钦定一些点是障碍点是好算的,直接 \(O(n \log n)\) 就可以做,这个是经典问题。

于是就想到容斥了,毕竟看见钦定一些点了嘛,乘上修正系数 \((-1)^{\text 钦定的点的个数}\) 就可以不关心未钦定的点了。

然后发现其实不能用 \(O(n \log n)\) 的那个 dp,需要用直接 \(O(n^2)\) 的那个 dp。

于是令 \(f_{i,j,k}\) 为从 \((0,0)\) 走到 \((i,j)\),钦定了 \(k\)\(-1\) 的方案数乘上修正系数的结果。

不过这样显然不够,因为是要关心一下每行每列必须只有一个障碍点的,所以加两维 \(0/1,0/1\) 表示第 \(i\) 行是否有障碍点、第 \(j\) 列是否有障碍点。

转移直接考虑选下个点或不选即可。

最后答案需要考虑掉没有钦定的点的方案数,因为是对于不同排列分别计数的,令 \(cnt\)\(-1\) 的个数那么乘上一个 \((cnt-k)!\) 即可。

upd:其实 dp 状态不用必须乘上修正系数,直接在最后统计的时候 \(\times (-1)^k\) 也是可以的

submission

天依宝宝可爱!


洛谷 P3349

思维难度:\(\color{#F39C11} 橙\) *1100

发现直接 dp 不行因为需要枚举子集是 \(O(3^n {\rm poly}(n))\) 的。但是注意到如果钦定子树 \(u\)\(S\) 的子集那么是好做的(直接背包转移即可),然后上子集反演秒了。

虽然复杂度 \(O(2^n n^3)\) 达到了 6e8,但是常数极小,交换枚举顺序卡一卡是能轻松 1s 内过掉的,甚至不用循环展开。

submission

天依宝宝可爱!


QOJ 1882

思维难度:\(\color{#52C41A} 绿\) *1700

难点在于状态的设计。

直接令 \(f_{i,j}\)\(i\) 时刻到达 \(j\) 的概率显然是不可以的,因为这样算出来的一条路径可能会存在经过终点的情况,这种情况就会导致概率算大了。

如何设计状态避免经过终点的情况呢?

可以想到不记录最终到达哪里,而是记录是否走到过位置 \(j\)。即令 \(f_{i,j}\)\(i\) 时刻经过 \(j\) 至少一次的概率。

但是这样就没法转移了呀!因为只有知道最终在哪里才能往后转移……吗?

想不到的地方来了。考虑令 \(f_{i,j}\)剩余 \(i\) 步,从当前位置走到位移 \(j\) 至少一次的概率。解释一下就是,初始位置随便在哪里都可以,然后 \(j\) 是相对于初始位置的偏移量。注意设的是剩余 \(i\) 步,也就是倒过来的过程,因为如果正着走就需要利用最终位置来转移了,这是行不通的。

转移就比较容易了,直接倒着走即可。因为设的是当前位置,所以相对位移是可以算的。式子:

\[f_{i,j} = p \times f_{i-1,j} + (1-p) \times f_{i-1,j-a_i} \]

初始状态是 \(f_{0,0}=1\)。并且在 dp 过程中,所有 \(f_{i,0}\) 都应该被置为 \(1\),因为初始就在初始位置上,故一定至少一次经过初始位置。

最后算答案,考虑 \(f_{n,j}\) 就可以表示从原题中的位置 \(0\) 开始走到位置 \(j\) 至少一次的概率,那么枚举每个可能的终点,则有:

\[ans = \frac 1 {2n+1} \sum _{j=-n} ^n f_{n,j} \]

submission

天依宝宝可爱!


CF1349D

思维难度:\(\color{#3498DB} 蓝\) *2200

是比较难想的。

考虑钦定某一个人胜利才算胜利该怎么做。显然只与在这个人手中的饼干数和不在这个人手中的饼干数有关,具体可以考虑一个 dp,令 \(f_i\) 表示这个人手中有 \(i\) 个饼干时,他胜利的期望步数,令总饼干数为 \(m\),那么考虑一次操作,显然有转移:

\[f_i = 1 + \frac i m f_{i-1} + \frac {m-i} m \left( \frac 1 n f_{i+1} + \frac {n-1} n f_i \right) \]

直接用主元法消元就可以做到 \(O(m)\)

根据期望的线性性,答案就是每个人胜利的期望步数之和。

但是注意有一个终止状态就是这个人之外的人手中有了 \(m\) 个饼干,这是在上面的 dp 中并没有考虑到的。所以要容斥一下减掉这一部分。

如何算呢?考虑一个经典 trick(在讲义的 Pg29 提到的),拆成两部分来考虑,令:

  • \(E(x)\)\(x\) 胜利的期望步数,过程中不在意是否有其他人达到了胜利状态。显然有 \(E(i) = f_{a_i}\)
  • \(Es(x)\)\(x\) 胜利的期望步数,过程中保证其他人不会达到胜利状态。
  • \(P(x)\)\(x\) 胜利的概率,过程中保证其他人不会达到胜利状态。
  • \(E(x \to y)\) 为从 \(x\) 胜利转移到 \(y\) 胜利的期望步数。显然 \(\forall x,y\),都有 \(E(x \to y) = f_0\)

那么有:

\[Es(x) = E(x) - \sum _{i \ne x} ( E(i \to x) P(i) + Es(i) ) \]

其中的 \(\sum\) 可以根据期望的线性性得到。

把可以带进去的 \(f\) 带进去得到:

\[Es(x) = f_{a_x} - \sum _{i \in [1,n] \land i \ne x} ( f_0 P(i) + Es(i) ) \]

然后答案就是所有 \(Es(x)\) 相加:

\[\begin{aligned} ans & = \sum _{x=1} ^n Es(X) \\ & = \sum _{x=1} ^n \left( f_{a_x} - \sum _{i=1} ^n [i \ne x] ( f_0 P(i) + Es(i) ) \right) \\ & = \sum _{x=1} ^n f_{a_x} - (n-1) f_0 \sum _{i=1} ^n P(i) - (n-1) \sum _{i=1} ^n Es(i) \end{aligned} \]

\(ans = \sum _{x=1} ^n Es(X)\) 代进去,再移个项,得到:

\[n \times ans = \sum _{x=1} ^n f_{a_x} - (n-1) f_0 \sum _{i=1} ^n P(i) \]

又因为最终一定会有一个人会赢,所以 \(\sum _{i=1} ^n P(i) = 1\),再把 \(n\) 除过去于是:

\[ans = \frac {\sum _{x=1} ^n f_{a_x} - (n-1) f_0} n \]

发现只剩下与 \(f\) 有关的东西了,于是就能直接做了。

但是还没完,因为据说不能直接消元解 \(f\),因为会出现分母为 \(0\) 的情况从而导致被卡掉。

然后有一个奇怪的做法,就是对于 \(f\) 的后缀差分数组 \(g\) 进行推式子,然后发现是可以正向递推的,就做完了。

大概是因为 \(f_i\) 的 dp 式子内同时出现了 \(f_{i-1} , f_i , f_{i+1}\),所以定义了 \(g\) 之后就只剩两项了,就一定可以递推了。推 \(g\) 的式子的过程就是先把 \(f_{i-1}\) 放到一边,并凑上相反系数的 \(f_i\),再整理另一边看看能不能将 \(f_i , f_{i+1}\) 的系数也变成相反的就可以了。

submission

天依宝宝可爱!


AT_agc002_f

思维难度:\(\color{#52C41A} 绿\) *1900

发现没什么道理可以容斥,所以不考虑容斥。容斥吃多了导致的(×

于是考虑 dp。

朴素的 dp 是不可以的,因为无论怎么样都绕不开一维 \(i\) 表示只考虑前 \(i\) 个位置,但是这已经 \(O(n^2)\) 了,再加维复杂度就爆了。

那么不如换个角度,分开每个颜色考虑。

然后发现这似乎是可以的,因为如果把一种颜色看作一个整体,先全部放完一个颜色在放后面的颜色,那么每种颜色的选择都可以用一个组合数来表示,而且不重不漏。

那么就容易了,哦对了显然白球的数量是要记的,而且要和彩球分开,令 \(f_{i,j}\) 为放了 \(i\) 个白球、\(j\) 种彩球的方案数,转移考虑放白球还是放彩球,就能直接做了,有:

\[f_{i,j} = f_{i-1,j} + (n-j+1) \binom {nk - (j-1)(k-1) - i} {k-1} f_{i,j-1} \]

注意白球必须放在当前状态最靠前的一个空位上,不然就会出现各种不合法情况。

但是发现这玩意不过样例。

手玩一下发现实际上是会算重的,先放白球再放彩球 和 先放彩球再放白球 分别会被统计一遍,就比如说:

初始状态 0.11..

  • 先放白球 0011.. 再放彩球 001122
  • 先放彩球 0.1122 再放白球 001122

(感谢一下这篇题解似乎是唯一一个讲清楚的。

这咋办?

看看白球是怎么处理的,那么彩球是否也可以类似地处理呢?发现是可以的!只要钦定必须在当前状态最靠前的一个空位上放一个彩球就可以避免了,而且显然可以做到不重不漏。

于是 dp 式子就变成了:

\[f_{i,j} = f_{i-1,j} + (n-j+1) \binom {nk - (j-1)(k-1) - i - 1} {k-2} f_{i,j-1} \]

根据人类直觉,这是正确的。

另外因为这样,\(k=1\) 就要特判掉了。

submission

天依宝宝可爱!


AT_agc038_e

思维难度:\(\color{#52C41A} 绿\) *2000

虽然并不容易,但是是可以想到的,每一步都是比较自然的过程。不过步骤还是比较多的。

首先因为多个物品不好做,所以考虑 min-max 容斥,转化为对于 \(U\) 的每个非空子集 \(S\) 求第一次出现被选了 \(b_i\) 次的数(或者说第一次获胜)的期望时间。或者表示成式子,有:

\[E(\max \{U\}) = \sum _{S \in U \land S \ne \varnothing} (-1)^{|S|+1} E(\min \{S\}) \]

然后求 \(E(\min \{S\})\)

考虑当时间为 \(t\) 时获胜的概率为 \(P(t)\),那么 \(E(\min \{S\}) = \sum _t t \cdot P(t)\),但是发现这是不好求的。所以考虑拆贡献。因为一个胜利状态中间肯定会经过若干个非胜利状态,每个非胜利状态都会产生 \(1 \cdot P({\rm something})\) 的贡献,又发现任意一个非胜利状态一定能到达一个胜利状态,所以它对答案产生贡献的概率就是它发生的概率,所以直接枚举第 \(i\) 个数当前选了 \(c_i\) 个,其中 \(c_i < b_i\)(因为需要满足时非胜利状态),有:

\[E(\min \{S\}) = \sum _{i \in S \land 0 \le c_i < b_i} P({\text 达到该状态}) \]

注意这只统计了非胜利状态的贡献,但要想到达胜利状态还需要整体 \(+1\),不过只要我们把 \(\forall c_i = 0\) 的状态也给一个 \(1\) 的贡献,就可以抵消掉这一部分了,所以上面那个式子时正确的。

然后计算达到一个状态的概率。

  • 首先要钦定一下只考虑 \(S\) 中的元素,忽略掉 \(U-S\) 中的元素,套路地,把所有产生 \(1\) 的贡献的地方换成 \(\frac 1 {P({\text 选择的数 \in S})}\) 即可,也就是:

    \[\frac {\sum _{i \in U} a_i} {\sum _{i \in S} a_i} \]

    转化到式子上就是最后乘上一个这个东西。

  • 然后是达到所有 \(c_i\) 的概率,考虑枚举每个 \(c_i\) 再乘起来,有:

    \[\prod _{i \in S} \left( \frac {a_i} {\sum _{j \in S} a_j} \right) ^{c_i} \]

  • 因为题意中生成随机数的过程是有序的,但我们枚举 \(S\) 以及枚举 \(a_i\) 的过程是无序的,所以还要乘上一个多重集的排列数:

    \[\frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \]

把上面三项乘起来得到:

\[P({\text 达到某~c_k~约束的状态}) = \frac {\sum _{i \in U} a_i} {\sum _{i \in S} a_i} \cdot \frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \prod _{i \in S} \left( \frac {a_i} {\sum _{j \in S} a_j} \right) ^{c_i} \]

再往回代入,代入到 \(E(\min \{S\})\) 再代入到整体答案,得到:

\[ans = \sum _{S \in U \land S \ne \varnothing} (-1)^{|S|+1} \sum _{k \in S \land 0 \le c_k < b_k} \frac {\sum _{i \in U} a_i} {\sum _{i \in S} a_i} \cdot \frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \prod _{i \in S} \left( \frac {a_i} {\sum _{j \in S} a_j} \right) ^{c_i} \]

推式子!

\[\begin{aligned} ans & = \sum _{S \in U \land S \ne \varnothing} (-1)^{|S|+1} \sum _{k \in S \land 0 \le c_k < b_k} \frac {\sum _{i \in U} a_i} {\sum _{i \in S} a_i} \cdot \frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \prod _{i \in S} \left( \frac {a_i} {\sum _{j \in S} a_j} \right) ^{c_i} \\ & = \left( \sum _{i \in U} a_i \right) \times \sum _{S \in U \land S \ne \varnothing} (-1)^{|S|+1} \cdot \frac 1 {\sum _{i \in S} a_i} \sum _{k \in S \land 0 \le c_k < b_k} \frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \prod _{i \in S} \left( \frac {a_i} {\sum _{j \in S} a_j} \right) ^{c_i} \\ & = \left( \sum _{i \in U} a_i \right) \times \sum _{S \in U \land S \ne \varnothing} (-1)^{|S|+1} \cdot \frac 1 {\sum _{i \in S} a_i} \sum _{k \in S \land 0 \le c_k < b_k} \frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \left( \prod _{i \in S} a_i^{c_i} \right) \cdot \left( \prod _{i \in S} \left( \frac 1 {\sum _{j \in S} a_j} \right) ^{c_i} \right) \\ & = \left( \sum _{i \in U} a_i \right) \times \sum _{S \in U \land S \ne \varnothing} (-1)^{|S|+1} \cdot \frac 1 {\sum _{i \in S} a_i} \sum _{k \in S \land 0 \le c_k < b_k} \frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \left( \frac 1 {\sum _{j \in S} a_j} \right) ^{\sum _{j \in S} c_j} \prod _{i \in S} a_i^{c_i} \\ & = \left( \sum _{i \in U} a_i \right) \times \sum _{S \in U \land S \ne \varnothing} (-1)^{|S|+1} \left( \frac 1 {\sum _{i \in S} a_i} \right) ^{\sum _{j \in S} c_j + 1} \sum _{k \in S \land 0 \le c_k < b_k} \frac {\left( \sum _{i \in S} c_i \right)!} {\prod _{i \in S} c_i!} \prod _{i \in S} a_i^{c_i} \end{aligned} \]

因为 \(\sum a , \sum b , \sum c\) 都很小,所以考虑 dp 求这个式子,看看什么是一定不用考虑的,什么是必须考虑的。

  • \(\left( \sum _{i \in U} a_i \right)\) 只与 \(U\) 有关,直接在最后(或者开始)乘上即可。不需要考虑。
  • \((-1)^{|S|+1}\) 在转移的时候乘 \(-1\) 即可。不需要考虑。
  • \(\sum a , \sum c\) 一定要考虑,因为式子中有太多关于这两个的项了,不丢到状态里面说不过去吧(
  • 那么还剩下 \(\frac 1 {\prod _{i \in S} c_i!}\)\(\prod _{i \in S} a_i^{c_i}\) 没有算,可以发现在考虑了 \(\sum a , \sum c\) 之后,这两个东西就可以在转移的时候顺便维护掉了。

当然还有固定的一维 \(i\) 表示考虑前 \(i\) 个元素。

于是得到 dp 状态:\(f_{i,j,k}\) 表示考虑前 \(i\) 个元素,当前 \(\sum a = j , \sum c = k\) 的上面那一坨式子(丢掉第一项 \(\sum _{i \in U} a_i\))的结果,考虑第 \(i\) 个元素是否选,若选的话选多少个,有转移:

\[f_{i,j,k} = f_{i-1,j,k} + \sum _{x=0} ^{b_i - 1} (-1) \cdot \frac 1 {x!} \cdot a_i^x \cdot f_{i-1,j-a_i,k-x} \]

但是这看起来是 \(O(n^4)\) 的呀!

然后发现实际上并不是的,因为 \(\sum b \le 400\),所以后面那个 \(\sum\) 是可以均摊掉的,复杂度其实是 \(O(n^3)\) 的。

哦对了初始状态,就是 \(f_{0,0,0} = -1\),因为有容斥系数。只需要考虑容斥系数不需要考虑后面那一坨,因为实际上 \(f_{0,0,0}\) 在我们的式子中是无意义的,但是为了转移,容斥系数是必须的。

最后统计答案是容易的,枚举 \(j,k\),再根据上面的式子乘上相应的系数即可,有:

\[ans = \left( \sum _{i \in U} a_i \right) \times \sum _{j,k} \frac 1 {j^{k+1}} \cdot k! \cdot f_{n,j,k} \]

做完了!!111

submission

天依宝宝可爱!


待补

ZR 615、AT_arc136_f、洛谷 P3179。

posted @ 2025-10-08 14:21  little__bug  阅读(11)  评论(0)    收藏  举报