题目
题目概要
用
[
x
i
]
F
(
x
)
[x^i]F(x)
[xi]F(x) 表示形式幂级数
F
(
x
)
F(x)
F(x) 中
x
i
x^i
xi 的系数。求
∑
i
=
0
m
[
x
i
]
(
1
+
x
1
−
x
)
n
\sum_{i=0}^{m}[x^i]\left(\frac{1+x}{1-x}\right)^n
i=0∑m[xi](1−x1+x)n
答案对
(
1
0
9
+
7
)
(10^9{+}7)
(109+7) 取模。
数据范围与提示
既可以解决
n
⩽
1
0
18
∧
m
⩽
1
0
7
n\leqslant 10^{18}\land m\leqslant 10^7
n⩽1018∧m⩽107 的情况,又可以解决
n
⩽
1
0
7
∧
m
⩽
1
0
18
n\leqslant 10^7\land m\leqslant 10^{18}
n⩽107∧m⩽1018 的情况。
思路
动态规划
这是一种已知结果,强行构造的 d p \tt dp dp 做法。它可以求出每一项的系数。
注意到 ( 1 + x ) n (1{+}x)^n (1+x)n 等价于 n n n 个有标号球的选择方案, 1 ( 1 − x ) n \frac{1}{(1-x)^n} (1−x)n1 等价于 n n n 个有标号盒子的任意选球方案。不妨将 n n n 个有标号球分别放进一个盒子里,问题转化为:有 2 n 2n 2n 个盒子,里面的球无编号,请选出 m m m 个球,满足其中 n n n 个盒子只能选 1 1 1 个球。
现在直接开始 d p \tt dp\rm dp 吧。考虑用 ( m − 1 ) (m{-}1) (m−1) 个球的方案生成 m m m 个球的方案。怎么做呢?很简单,随便找一个盒子,多选一个。也就是 2 n ⋅ f ( m − 1 ) 2n\cdot f(m{-}1) 2n⋅f(m−1) 。问题接踵而至:
- 每个方案被计算的次数不同。如果一个 m m m 球的方案中,有 k k k 个盒子拿了至少一个球,那么它被计算到的次数是 k k k 。
想办法 “填平” 每个方案的计算次数。一个方案只会被计算 k k k 次的原因是,并不是所有的球都可以是 ( m − 1 ) (m{-}1) (m−1) 球的方案的转移中新加入的球。那么我们就强迫它们可以!只要所有的球都可能成为新加入的球,方案的系数就是 m m m,直接作除法即可。
然而强迫的时候,还要让它不是原本就计算过的、盒子中 “最顶端” 的球(每个盒子本来只有一个球是可以成为新加球的)。最好的方法就是 二者都选,即,选出 “最顶端” 的球之后再选一个同盒子内的球。显然再选出的一个就不是 “最顶端” 的球了。
这样的方案怎么得到呢?肯定是
(
m
−
2
)
(m{-}2)
(m−2) 球的方案,然后在同一个盒子里多选两个。考虑一个
(
m
−
2
)
(m{-}2)
(m−2) 球方案中,选了
x
x
x 个球的盒子,如果要在这个盒子里多选两个,方案的系数应当为
(
x
+
1
)
(x{+}1)
(x+1),即 “最顶端” 是固定的,但是剩下的一个可能是原本的
(
x
+
1
)
(x{+}1)
(x+1) 个 “非顶端“ 中的任意一个。总系数为
∑
(
x
+
1
)
=
(
m
−
2
)
+
2
n
\sum(x{+}1)=(m{-}2)+2n
∑(x+1)=(m−2)+2n,所以我们初步认为
f
(
m
)
=
2
n
⋅
f
(
m
−
1
)
+
(
2
n
+
m
−
2
)
f
(
m
−
2
)
m
f(m)=\frac{2n\cdot f(m{-}1)+(2n{+}m{-}2)f(m{-}2)}{m}
f(m)=m2n⋅f(m−1)+(2n+m−2)f(m−2)
若没有 “其中
n
n
n 个盒子至多选一个球” 的约束,则
f
(
m
)
=
(
2
n
+
m
−
1
m
)
f(m)={2n+m-1\choose m}
f(m)=(m2n+m−1) 便满足上面的递推式。读者可自行验证。所以我们要解决第二个问题:
- 非法方案也被统计了。
非法方案必定是某个 “特殊盒子”(至多选一个球的)选了 2 2 2 或 3 3 3 个球。选 2 2 2 个球,会在 f ( m − 1 ) f(m{-}1) f(m−1) 中统计一次,在 f ( m − 2 ) f(m{-}2) f(m−2) 中统计一次;选 3 3 3 个球,会在 f ( m − 2 ) f(m{-}2) f(m−2) 中统计两次。所以我们发现,非法方案的系数一定是 2 2 2 。这是个美丽的巧合吗?
在
f
(
m
−
2
)
f(m{-}2)
f(m−2) 中随便选一个 “特殊盒子” 多放两个球,就得到所有非法方案。其系数是
2
2
2,所以只需减去
2
n
⋅
f
(
m
−
2
)
2n\cdot f(m{-}2)
2n⋅f(m−2) 。综上所述
f
(
m
)
=
2
n
⋅
f
(
m
−
1
)
+
(
m
−
2
)
⋅
f
(
m
−
2
)
m
f(m)=\frac{2n\cdot f(m{\rm-}1)+(m{\rm-}2)\cdot f(m{\rm-}2)}{m}
f(m)=m2n⋅f(m−1)+(m−2)⋅f(m−2)
其中
f
(
m
)
f(m)
f(m) 是
m
m
m 球的方案。递推即可,时间复杂度
O
(
m
)
\mathcal O(m)
O(m) 。
生成函数
或许它是如 O U Y E \sf OUYE OUYE 等强者的做法;或许它是我知道结果之后生硬构造的解释。
记
G
(
x
)
=
(
1
+
x
1
−
x
)
n
G(x)=({1+x\over 1-x})^n
G(x)=(1−x1+x)n,则有
G
′
(
x
)
=
n
⋅
(
1
+
x
)
n
−
1
(
1
−
x
)
n
+
n
⋅
(
1
+
x
)
n
(
1
−
x
)
n
+
1
⇒
G
′
(
x
)
=
(
1
1
+
x
+
1
1
−
x
)
n
G
(
x
)
=
2
n
1
−
x
2
G
(
x
)
\begin{aligned} G'(x) &={n\cdot (1+x)^{n-1}\over(1-x)^n}+{n\cdot (1+x)^n\over(1-x)^{n+1}}\\ \Rightarrow G'(x) &=\left(\frac{1}{1+x}+\frac{1}{1-x}\right)nG(x)\\ &=\frac{2n}{1-x^2}G(x) \end{aligned}
G′(x)⇒G′(x)=(1−x)nn⋅(1+x)n−1+(1−x)n+1n⋅(1+x)n=(1+x1+1−x1)nG(x)=1−x22nG(x)
移项后得
G
′
(
x
)
=
x
2
G
′
(
x
)
+
G
(
x
)
G'(x)=x^2G'(x)+G(x)
G′(x)=x2G′(x)+G(x),这与 动态规划
的式子等价。
暴力展开
只需计算 [ x m ] ( 1 + x ) n ( 1 − x ) n + 1 [x^m]{(1+x)^n\over(1-x)^{n+1}} [xm](1−x)n+1(1+x)n 。由于 ( 1 + x ) n (1{+}x)^n (1+x)n 和 1 ( 1 − x ) n + 1 1\over(1-x)^{n+1} (1−x)n+11 的任意项系数都是可以快速计算的,直接 O ( n ) \mathcal O(n) O(n) 枚举 ( 1 + x ) n (1{+}x)^n (1+x)n 中的每一项即可。