「CF1174E」Ehab and the Expected GCD Problem

Description

Link:CF1174E

对于一个长度为 nn 的排列 pp,定义 f(p)f(p) 表示:令 gig_i 表示 p1,,pip_1, \cdots, p_i 的最大公约数,则 f(p)f(p) 表示 g1,g2,,gng_1, g_2, \cdots, g_n 中不同元素的个数。

fmax(n)f_{\max}(n) 表示所有关于 nn 的排列 pp 中的 f(p)f(p) 最大值,求有多少个关于 nn 的排列 pp 满足 f(p)=fmax(n)f(p) = f_{\max}(n)。答案对 109+710^9 + 7 取模。

数据范围:2n1062 \leq n \leq 10^6

时空限制:22s / 256256MiB。

Solution

本质不同的前缀 gcd 是 O(logn)\mathcal{O}(\log n) 级别的,因为当前缀 gcd 改变时,新的 gcd 一定为旧的 gcd 的约数。

考虑在唯一分解角度下观察 gcd,设 gcd 为 pici\sum p_i^{c_i},为了使得本质不同的前缀 gcd 最多,当 gcd 变化时,肯定是选择某一个 cici1c_i \gets c_i - 1。故为了使得本质不同的 gcd 最多,就是要使得排列的第一个数的 ci\sum c_i 最多。

首先,肯定不会存在质因子 pi5p_i \geq 5,因为此时可以将 pip_i 换成 222^2ci\sum c_i 更大且仍然合法。

其次,肯定不会存在 33 的次数 2\geq 2,因为此时可以将 323^2 换成 232^3ci\sum c_i 更大且仍然合法。

故第一个数只能被表示成 2x3y2^x3^y,其中 y{0,1}y \in \{0, 1\}。状态数为 O(logn)\mathcal{O}(\log n)

f(i,x,y)f(i, x, y) 表示,填到排列的前 ii 位,且当前的 gcd 为 2x3y2^x3^y 时的方案数。设 calc(x)=nx\mathrm{calc}(x) = \left\lfloor \frac{n}{x} \right\rfloor 表示 1,,n1, \cdots, nxx 的倍数的个数。

f(i+1,x,y)+f(i,x,y)(calc(2x3y)i)f(i+1,x1,y)+f(i,x,y)(calc(2x13y)calc(2x3y))f(i+1,x,y1)+f(i,x,y)(calc(2x3y1)calc(2x3y))f(i + 1, x, y) \gets_{+} f(i, x, y) \cdot (\mathrm{calc}(2^x3^y) - i) \\ f(i + 1, x - 1, y) \gets_{+} f(i, x, y) \cdot (\mathrm{calc}(2^{x - 1}3^y) - \mathrm{calc}(2^x3^y)) \\ f(i + 1, x, y - 1) \gets_{+} f(i, x, y) \cdot (\mathrm{calc}(2^x3^{y - 1}) - \mathrm{calc}(2^x3^y))

初态:记 u=log2nu = \lfloor \log_2 n \rfloor,则有 f(1,u,0)=1f(1, u, 0) = 1;若 2u13n2^{u - 1}3 \leq n 时,还有 f(1,u1,1)=1f(1, u - 1, 1) = 1

终态:f(n,0,0)f(n, 0, 0)