Codechef July15 EASYEX

12 篇文章 0 订阅
6 篇文章 1 订阅

  来自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快了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值