一、题目
二、解法
首先有一个显然的
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[i−1][j]×C(n−j,j−k)×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[i−1][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][i−j]×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][i−j]×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]×(i−j)!f[m][i−j]那么时间复杂度
O
(
n
log
n
log
n
)
O(n\log n\log n)
O(nlognlogn)
咕咕咕