CF1603E A Perfect Problem
一个完美的序列满足任何非空子序列的最大值与最小值乘积大于等于其总和,求长度为 \(n\),值域为 \([1, n+1]\) 的完美序列个数,对质数 \(M\) 取模。
\(n\le 200\)
给这个序列排序后,注意到如果所有前缀合法,那么任何子序列都合法。一个观察是,如果第一个数太小,那么总是无解。设第一个数为 \(a\),不妨假设我们填入的是实数而不是整数,且每个位置都填入能填的最小的数,要求最后一个数 \(\le n+1\),设当前数为 \(x\),前缀和为 \(s\),下一个数是 \(x'\),则 \(ax' = s+x', s = ax\),则 \(x' = \frac{a}{a-1}x\),所以要求 \(a(\frac{a}{a-1})^{n-1}\le n+1\),即 \([(1+\frac{1}{a-1})^{a-1}]^\frac{n-1}{a-1}\le \frac{n+1}{a}\),据此进行一些估计,发现 \(a\) 的数值必须很接近 \(n\)。用程序贪心模拟可以发现,在 \(n = 200\) 时,\(a > 180\),而 \(n\) 更小的情形也类似。
注意到 \(a_1n+\sum a_i - a_1 = \sum a_i \le a_1a_n\le a_1(n+1)\),所以 \(\sum a_i-a_1 \le a_1\)。所以枚举 \(a_1 = fst\) 后,直接进行 DP,设 \(f_{i,j,s}\) 表示值域 \([fst,i]\),总共填了 \(j\) 个数,\(s\) 记录 \(\sum_{k=1}^ja_j-a_1\),转移时枚举 \(t\in [0, \frac{s}{i-fst}]\)。那么 \(s\) 的范围是 \([0, a_1]\),这样总复杂度只有 \(\Theta(m\cdot n\cdot n\cdot \sum_{i=1}^m \frac{n}{i}) = \Theta(n^3m\log m)\),卡卡就过了。