题目的限制很奇怪,碰到这种限制我们要做的事情就是把它翻译成人话。
假设数组长度为 \(n\),那么对于数组的最大值 \(x\),显然一定存在 \(f(n)=x\),这个时候我们必须要求 \(f(n-1) \neq x\),可以发现,如果 \(x\) 不在第一个位置或者最后一个位置,那么一定有 \(f(n-1)=x\),因此最大值一定在最左侧或者最右侧。
同时,我们注意到 \(f(n-1)\) 是 \(f(n)\) 的因数,并且实际上这两个集合是 \(\text{{x,second_x}}\) 和 \(x\)。那么我们考虑删去最大值,剩下的序列仍然满足条件。递归论证可以发现,这个序列是一个严格的单谷序列。而在这样的情况下,\(f(k)\) 的取值实际上是序列排序后每个后缀的 \(\gcd\),题目要求它们两两不同。
这样,我们可以考虑从大到小加入元素。设 \(f_i\) 表示目前的后缀 \(\gcd\) 为 \(i\) 的序列个数,假设我们现在加入 \(i\),那么暴力地做,我们应该是:
枚举 \(i\) 的一个因数 \(j\),对其的贡献是:
可以对其进行莫比乌斯反演:
枚举 \(k = jk'\):
枚举 \(d\):
这个时候考虑维护一个 \(g_k\) 表示 \(\sum f_v[k|v]\),那么枚举 \(i\) 的因数 \(j\),然后枚举 \(\frac{i}{j}\) 的因数 \(d\),把 \(\mu(d)g_{dj}\) 加进对 \(f_j\) 的贡献即可。注意 \(f_j\) 不能对 \(f_j\) 自己有贡献,因此要单独去掉这部分。这一部分的贡献整体要乘以 2,因为对于最小值,它可以放在目前序列最小值的左侧或者右侧两个位置。但对于新开一个只包含一个元素 \(i\) 的序列,只有 1 种方案数。
代码