Description
Link:CF1174E
对于一个长度为 n 的排列 p,定义 f(p) 表示:令 gi 表示 p1,⋯,pi 的最大公约数,则 f(p) 表示 g1,g2,⋯,gn 中不同元素的个数。
令 fmax(n) 表示所有关于 n 的排列 p 中的 f(p) 最大值,求有多少个关于 n 的排列 p 满足 f(p)=fmax(n)。答案对 109+7 取模。
数据范围:2≤n≤106。
时空限制:2s / 256MiB。
Solution
本质不同的前缀 gcd 是 O(logn) 级别的,因为当前缀 gcd 改变时,新的 gcd 一定为旧的 gcd 的约数。
考虑在唯一分解角度下观察 gcd,设 gcd 为 ∑pici,为了使得本质不同的前缀 gcd 最多,当 gcd 变化时,肯定是选择某一个 ci←ci−1。故为了使得本质不同的 gcd 最多,就是要使得排列的第一个数的 ∑ci 最多。
首先,肯定不会存在质因子 pi≥5,因为此时可以将 pi 换成 22,∑ci 更大且仍然合法。
其次,肯定不会存在 3 的次数 ≥2,因为此时可以将 32 换成 23,∑ci 更大且仍然合法。
故第一个数只能被表示成 2x3y,其中 y∈{0,1}。状态数为 O(logn)。
设 f(i,x,y) 表示,填到排列的前 i 位,且当前的 gcd 为 2x3y 时的方案数。设 calc(x)=⌊xn⌋ 表示 1,⋯,n 中 x 的倍数的个数。
f(i+1,x,y)←+f(i,x,y)⋅(calc(2x3y)−i)f(i+1,x−1,y)←+f(i,x,y)⋅(calc(2x−13y)−calc(2x3y))f(i+1,x,y−1)←+f(i,x,y)⋅(calc(2x3y−1)−calc(2x3y))
初态:记 u=⌊log2n⌋,则有 f(1,u,0)=1;若 2u−13≤n 时,还有 f(1,u−1,1)=1。
终态:f(n,0,0)。