Description
给定一个长度为 $n\ (1 \leq n \leq 10^{18})$ 的序列和 $2$ 个 可重 集合:$PR$ 和 $NF$ 。现在要把它分成若干块,块的大小有限制,允许的块长为 $PR \cap NF$。求有多少种不同的分块方案,答案对 $10^9 + 7$ 取模。(设最大块长为 $x$,$1 \leq |PR|,|NF|,x \leq 100$)。
Source
Solution
$60 \rm pts$:
考虑 动态规划 。
先预处理出所有可能的块长 $a_1 \sim a_m$(注意要去重)。
用 $f_i$ 表示长度为 $i$ 的序列的分块方案数。
初始 $f_0 = 1$ 。(长度为 $0$ 的序列一定有 $1$ 种分块方案)
状态转移方程(考虑分出来最后一块的块长为 $a_j$):
直接转移是 $O(n)$ 的。
$100\rm pts$:
发现块长最大只有 $100$($\max\limits_{i = 1}^m \{a_i\} \leq 100$),所以考虑用 矩阵乘法 优化上述 DP 。
若矩阵的大小为 $size \times size$,则有 $size = \max\limits_{i = 1}^m \{a_i\}$(因为 $f_i$ 不可能由 $f_{i - 100}$ 之前的转移过来)。
先构造初始矩阵。根据 $f_0 = 1$,DP 预处理出 $f_1 \sim f_{size - 1}$,然后才能转移。
接下来构造转移矩阵。首先根据 $f_i = \sum\limits_{j = 1}^m f_{i - a_j}$ 得知,矩阵第一行中,第 $a_i$ 个数为 $1$,其余为 $0$ 。剩下的 $f_{i-1} \sim f_{i - size + 1}$ 都可以在上一个矩阵中找到,所以对应的标为 $1$,其它为 $0$ 。
最后是答案矩阵。
答案矩阵的第 $1$ 行第 $1$ 列即是最终答案。时间复杂度为 $O(size^3\log n)$ 。
Code
1 |
|