CF623E Transforming Sequence

一、题目

点此看题

二、解法

首先有一个显然的 d p dp dp,设 d p [ i ] [ j ] dp[i][j] dp[i][j]为前 i i i轮选 j j j个的方案数:
d p [ i ] [ k ] = ∑ d p [ i − 1 ] [ j ] × C ( n − j , j − k ) × 2 j dp[i][k]=\sum dp[i-1][j]\times C(n-j,j-k)\times 2^j dp[i][k]=dp[i1][j]×C(nj,jk)×2j发现这样很不好优化,我们设 f [ i ] [ j ] = d p [ i ] [ j ] C ( n , j ) f[i][j]=\frac{dp[i][j]}{C(n,j)} f[i][j]=C(n,j)dp[i][j],也就是先钦定这些要选的东西,那么转移:
f [ i ] [ k ] = ∑ f [ i − 1 ] [ j ] × C ( k , j ) × 2 j f[i][k]=\sum f[i-1][j]\times C(k,j)\times 2^j f[i][k]=f[i1][j]×C(k,j)×2j发现两个 d p dp dp可以合并:
f [ n + m ] [ i ] = ∑ f [ n ] [ j ] × f [ m ] [ i − j ] × C ( i , j ) × 2 m j f[n+m][i]=\sum f[n][j]\times f[m][i-j]\times C(i,j)\times 2^{mj} f[n+m][i]=f[n][j]×f[m][ij]×C(i,j)×2mj主要解释一下后面的 2 m j 2^{mj} 2mj,其实合并就相当于分部选,我们要选 m m m次,每次都可以在大小为 k k k的子集中随便选,还有:
f [ 2 n ] [ i ] = ∑ f [ n ] [ j ] × f [ n ] [ i − j ] × C ( i , j ) × 2 n j f[2n][i]=\sum f[n][j]\times f[n][i-j]\times C(i,j)\times 2^{nj} f[2n][i]=f[n][j]×f[n][ij]×C(i,j)×2nj还可以用 ntt \text{ntt} ntt优化,化成这样的形式:
f [ n + m ] [ i ] = i ! ∑ 2 m j f [ n ] [ j ] j ! × f [ m ] [ i − j ] ( i − j ) ! f[n+m][i]=i!\sum \frac{2^{mj}f[n][j]}{j!}\times\frac{f[m][i-j]}{(i-j)!} f[n+m][i]=i!j!2mjf[n][j]×(ij)!f[m][ij]那么时间复杂度 O ( n log ⁡ n log ⁡ n ) O(n\log n\log n) O(nlognlogn)

咕咕咕
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值