2025 山东省队集训第二轮 D5T1-互质序列

题目大意:

给定 \(n,q\),有 \(q\) 次查询,每次给定一个整数 \(m\)
求有多少个长度为 \(n\) 的序列 \(a\),使得:

  1. \(a_{i} | n\)
  2. \((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)\)

总结:

感觉这题赛时唯一没想到的点就是讲矩阵压缩。
当然也知道了矩阵快速幂的优化方法。

  1. 稀疏。
  2. 有不影响转移的相同的状态。
posted @ 2025-05-04 23:29  positive_deviation  阅读(49)  评论(0)    收藏  举报