标签:time log mat 矩阵快速幂 cap mit 方案 游戏 要求
用 \(p\) 种颜色填 \(n\times m\) 的画板,要求任意相邻两列的颜色数都不少于 \(p\) ,求方案数。
\(1\leq n\leq 100,1\leq m\leq 10^9,q\leq p\leq 100\)
观摩 \(m\) 的范围,显然需要一个 \(\log m\) 的做法,于是想到了矩阵快速幂。
首先考虑原始的转移。对于每一列,定义 \(g[i][j]\) ,表示当前填到第 \(i\) 行的格子,用了 \(j\) 种颜色的方案数。由于每一列的情况都是类似的,所以可以预处理出来。
加号前的转移表示选了一个新的颜色,加号之后的是我在之前选的 \(j\) 种颜色中又选了一种填在这里。
所以所有的 \(g[n][j]\) 则表示当前一列选了\(j\) 种颜色的方案数。根据第二类斯特林数,当前一列涂上 \(j\) 种颜色的方案数就是 \(\cfrac{g[n][j]}{C_p^j}\)。
所以若当前一列涂上 \(j\) 种颜色,下一列要涂 \(k\) 种颜色,则方案数如下:
前一个组合数是 \(j\) 和 \(k\) 颜色中交集的部分,而后一个就是交集的补集。其中边界的意思分别为 \(j\cap k=\varnothing\) 和 \(j\subset k\) 或 \(k\subset j\)。
设 \(h[i][j]\) 表示:
则令 \(f[i][j]\) 为当前选到第 \(i\) 列,当前一列涂了 \(j\) 种颜色的方案数,则可以得到 \(f[i][j]=f[i-1][j]\times h[j][k]\),边界为 \(f[1][j]=g[n][j]\)。由于 \(f\) 的转移系数与 \(i\) 无关,所以可以用矩阵快速幂优化转移 \(m-1\) 次后得到结果,时间复杂度 \(O(n^3\log m)\)。
标签:time log mat 矩阵快速幂 cap mit 方案 游戏 要求
原文地址:https://www.cnblogs.com/Midoria7/p/13720879.html