题目
传送门 to CF
传送门 to VJ
思路
请参见大佬的博客,大概讲的就是:
插叙一个小常识:薛定谔的扑克牌。桌面上的扑克牌在被观测的一瞬间才被确定,所以某一次观察只看第一张牌,看到 Joker 的概率自然是 m1 。
k 次方是难以计算的。我们不如把 n 次查看的结果记录为 a1,a2,a3,…,an ,是 Joker 则为 1 ,否则为零。现在我们要计算的是 (i=1∑nai)k
把它看成 k 个多项式相乘,这个式子等价于 x1,x2,x3,…,xk∈[1,n]∑ax1ax2ax3⋯axk
注意 x1,x2,x3,…,xk 不一定是互不相同的。
然后我们就可以直接进行动态规划了。用 f(k0,n0) 表示,目前已经有 k0 个 a 乘起来,但是不同的 x 只有 n0 个。形式化地,我们有 f(k0,n0)=x1,x2,x3,…,xk0∈[1,n]∑card{x1,x2,x3,…,xk0}=n0ax1ax2ax3⋯axk0
规范一些,两个条件应该都在 Σ 下方,但是我不会换行。card 表示集合内元素数量。这里的集合当然是不可重集合。
如何进行 dp 转移呢?只需要考虑添加 xk0 能否导致 card 增大。求和额外乘上使 axk0=1 的 xk0 的个数就是了。
用数学语言也可以表达。为了方便写,我把 x1 作为决策对象,而不是上文中的 xk0 。
f(k0,n0)=x1,x2,x3,…,xk0∈[1,n]∑card{x1,x2,x3,…,xk0}=n0ax1ax2ax3⋯axk0=x2,x3,x4,…,xk0∈[1,n]∑card{x2,x3,x4,…,xk0}=n0ax2ax3ax4⋯axk0x1∈[1,n]∑x1∈{x2,x3,x4,…,xk0}ax1+x2,x3,x4,…,xk0∈[1,n]∑card{x2,x3,x4,…,xk0}=n0−1ax2ax3ax4⋯axk0x1∈[1,n]∑x1∈{x2,x3,x4,…,xk0}ax1
写成方程式的形式就是 f(k0,n0)=n0⋅f(k0−1,n0)+[n−(n0−1)]⋅f(k0−1,n0−1)
然后算期望怎么办?我们得乘上概率。概率是多少啊?——注意到 ax1,ax2,ax3,…,axk 都会被钦定成 1 ,而剩下的 a 是无限制的。所以这个概率为 m−k 。然后求和即可,ans=x=1∑km−x⋅f(k,x)
时间复杂度 O(k2) ,完美的通过了本题。我好菜啊
代码
边界条件是 f(0,0)=1 ,其余为零。表示一个 a 也没有乘,类似于 ∏i=10⋯ 的玩意儿。集合当然是 Ø ,大小为零。
具体代码肯定不需要我来实现了,因为我是菜逼。