Codechef July15 EASYEX

来源:互联网 发布:小眼睛美女 知乎 编辑:程序博客网 时间:2024/06/05 08:48

  来自2016集训队作业。


  题意:有1..KK个数,选n次,求1..L的出现次数的乘积的F次方的期望模2003,F1000,LF50000


  令xi,j表示在第i轮里数j是否被选中,则所求为Li=1(nj=1xj,i)F的期望。
  考虑这个式子完全展开后的形态,如果某个项里存在同一轮的两个不同数的变量,那么这个项的贡献显然是0。每个变量为1的概率是1/K,所以每一项的期望我们可以很容易的算出来。同时可以注意到,项和项之间都是独立的,由期望线性性,现在我们单独考虑某个项的系数,最后再把所有项的期望加到一起。
  设fi,j表示只含前i个数的变量,这个单项式里有j个不同的变量。先不考虑每轮之间怎么选,注意每次加的变量的轮数和别的变量的轮数不能相同,所以我们可以直接在(nj=1xj,i)F这个式子里选k个变量出来,这相当于是将F个本质不同的数分成k个集合,也就是斯特林子集数S(F,k),所以我们可以有转移fi,j=Fk=1fi1,jkS(F,k)
  因为我们每次只会加F个变量, 所以最后总共也只有LF项,所以这可以用倍增FFT优化。
  最后答案还要算回选的变量的顺序,所以答案是
  

k=LLFnkKkfL,k

  到这里的时间复杂度是T(L)=T(L/2)+O(LFlog(LF))=O(LFlog(LF)logL)
  然而仔细观察答案的式子里有nk这一项,当k2003时必然有模2003为0。所以我们可以只用1...2003的项,这样直接暴力卷积就比FFT快了。

原创粉丝点击