[CF1278F]Cards

题目

传送门 to CF

传送门 to VJ

思路

请参见大佬的博客,大概讲的就是:

插叙一个小常识:薛定谔的扑克牌。桌面上的扑克牌在被观测的一瞬间才被确定,所以某一次观察只看第一张牌,看到 JokerJoker 的概率自然是 1m\frac{1}{m}

kk 次方是难以计算的。我们不如把 nn 次查看的结果记录为 a1,a2,a3,,ana_1,a_2,a_3,\dots,a_n ,是 JokerJoker 则为 11 ,否则为零。现在我们要计算的是 (i=1nai)k\left(\sum_{i=1}^{n}a_i\right)^k

把它看成 kk 个多项式相乘,这个式子等价于 x1,x2,x3,,xk[1,n]ax1ax2ax3axk\sum_{x_1,x_2,x_3,\dots,x_k \in[1,n]}a_{x_1}a_{x_2}a_{x_3}\cdots a_{x_k}

注意 x1,x2,x3,,xkx_1,x_2,x_3,\dots,x_k 不一定是互不相同的。

然后我们就可以直接进行动态规划了。用 f(k0,n0)f(k_0,n_0) 表示,目前已经有 k0k_0aa 乘起来,但是不同的 xx 只有 n0n_0 个。形式化地,我们有 f(k0,n0)=x1,x2,x3,,xk0[1,n]card{x1,x2,x3,,xk0}=n0ax1ax2ax3axk0f(k_0,n_0)=\sum_{x_1,x_2,x_3,\dots,x_{k_0}\in[1,n]}^{card\{x_1,x_2,x_3,\dots,x_{k_0}\}=n_0}a_{x_1}a_{x_2}a_{x_3}\cdots a_{x_{k_0}}

规范一些,两个条件应该都在 Σ\Sigma 下方,但是我不会换行。cardcard 表示集合内元素数量。这里的集合当然是不可重集合。

如何进行 dpdp 转移呢?只需要考虑添加 xk0x_{k_0} 能否导致 cardcard 增大。求和额外乘上使 axk0=1a_{x_{k_0}}=1xk0x_{k_0} 的个数就是了。

用数学语言也可以表达。为了方便写,我把 x1x_1 作为决策对象,而不是上文中的 xk0x_{k_0}

f(k0,n0)=x1,x2,x3,,xk0[1,n]card{x1,x2,x3,,xk0}=n0ax1ax2ax3axk0=x2,x3,x4,,xk0[1,n]card{x2,x3,x4,,xk0}=n0ax2ax3ax4axk0x1[1,n]x1{x2,x3,x4,,xk0}ax1+x2,x3,x4,,xk0[1,n]card{x2,x3,x4,,xk0}=n01ax2ax3ax4axk0x1[1,n]x1∉{x2,x3,x4,,xk0}ax1\begin{aligned} f(k_0,n_0)&=\sum_{x_1,x_2,x_3,\dots,x_{k_0}\in[1,n]}^{card\{x_1,x_2,x_3,\dots,x_{k_0}\}=n_0}a_{x_1}a_{x_2}a_{x_3}\cdots a_{x_{k_0}}\\ &=\sum_{x_2,x_3,x_4,\dots,x_{k_0}\in[1,n]}^{card\{x_2,x_3,x_4,\dots,x_{k_0}\}=n_0}a_{x_2}a_{x_3}a_{x_4}\cdots a_{x_{k_0}}\sum_{x_1\in[1,n]}^{x_1\in\{x_2,x_3,x_4,\dots,x_{k_0}\}}a_{x_1}\\ &+\sum_{x_2,x_3,x_4,\dots,x_{k_0}\in[1,n]}^{card\{x_2,x_3,x_4,\dots,x_{k_0}\}=n_0-1}a_{x_2}a_{x_3}a_{x_4}\cdots a_{x_{k_0}}\sum_{x_1\in[1,n]}^{x_1\not\in\{x_2,x_3,x_4,\dots,x_{k_0}\}}a_{x_1} \end{aligned}

写成方程式的形式就是 f(k0,n0)=n0f(k01,n0)+[n(n01)]f(k01,n01)f(k_0,n_0)=n_0\cdot f(k_0-1,n_0)+[n-(n_0-1)]\cdot f(k_0-1,n_0-1)

然后算期望怎么办?我们得乘上概率。概率是多少啊?——注意到 ax1,ax2,ax3,,axka_{x_1},a_{x_2},a_{x_3},\dots,a_{x_k} 都会被钦定成 11 ,而剩下的 aa 是无限制的。所以这个概率为 mkm^{-k} 。然后求和即可,ans=x=1kmxf(k,x)ans=\sum_{x=1}^{k}m^{-x}\cdot f(k,x)

时间复杂度 O(k2)\mathcal O(k^2) ,完美的通过了本题。我好菜啊

代码

边界条件是 f(0,0)=1f(0,0)=1 ,其余为零。表示一个 aa 也没有乘,类似于 i=10\prod_{i=1}^{0}\cdots 的玩意儿。集合当然是 Ø\text{\O} ,大小为零。

具体代码肯定不需要我来实现了,因为我是菜逼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章