2025 山东省队集训第二轮 D5T1-互质序列
题目大意:
给定 \(n,q\),有 \(q\) 次查询,每次给定一个整数 \(m\)。
求有多少个长度为 \(n\) 的序列 \(a\),使得:
- \(a_{i} | n\)。
- \((a_{i}, a_{i + 1}) \neq 1\)。
\(n \le 10^{16}, m \le 10^{18}, q \le 150\)。
解题思路:
先考虑最简单的部分分:\(n \le 10^6, m \le 100, q \le 150\) 怎么做。
因为要求全是 \(n\) 的因子,且两两不互质,那么我们只关心两个数的质因子集合是否有交即可。
那么只需设 \(dp_{i,S}\) 表示前 \(i\) 个满足条件的,其中 \(a_{i}\) 的质因子的集合为 \(S\) 的方案数。
转移很好转移,设 \(f(x)\) 表示 \(1 \sim x\) 中不同的质因子个数最多为 \(f(x)\)。
时间复杂度 \(O(m \times 2^{f(n)})\),当 \(n = 10^{16}\) 时 \(f(x) = 13\)。
那么在不考虑科技的情况下我们只学过矩阵快速幂优化 \(m \le 10^18\) 这个条件。
可矩阵大小为 \(2^{13} \times 2^{13}\),且不是很稀疏,只能缩小矩阵。
这个矩阵看着不好优化啊,但是不是两个本质不同的状态时不同的当且仅当他们的状态的 1 的数量不同?
不是的,因为你考虑转移的时候还得乘你每个质因子出现次数加一的积。
当 \(n = 2^3 \times 3^3\) 时,不难发现 \(2,3\) 是本质相同的。
所以我们只需要记录每种不同次数的质因子各出现了多少次。
那么压缩的状态就是 \(255\) 左右。
这样就能过掉 \(n \le 10^{16}, m \le 10^{18}, q = 1\)。
可是我们要查询 \(q = 150\) 次还是会 TLE。
套路的,我们预处理出每个矩阵的 \(2^0, 2^1, 2^2 \sim\) 次方。
那么查询的时候可以拿一个 \(1 \times 255\) 的矩阵来乘。
时间复杂度:\(O(T^3 \log m + q \times T^2 \log m)\)。
总结:
感觉这题赛时唯一没想到的点就是讲矩阵压缩。
当然也知道了矩阵快速幂的优化方法。
- 稀疏。
- 有不影响转移的相同的状态。

浙公网安备 33010602011771号