求满足下列条件的长度为 $n$,值域为 $[1,n]$ 的序列 $a$ 的个数,对 $m$ 取模。
- $\forall i\in[1,n-1],a_i\le a_{i+1}$
- $\forall k\in[1,n-1],a$ 中任意 $k+1$ 个数的和必定大于任意 $k$ 个数的和
$2\le n\le5000,9\times10^8<m<10^9$,$m$ 为质数。
由于 $a$ 单调不降,根据常见套路,我们将 $a$ 差分,设差分数组为 $d$,其中 $d_0=1$。
那么条件 $1$ 即为 $\forall i\in[1,n],d_i\ge 0,\sum_{i=1}^n d_i\le n-1$。
对于条件 $2$,显然取最小的 $k+1$ 个数和最大的 $k$ 个数,稍加思考可知,只要满足 $k=\lfloor\frac{n-1}{2}\rfloor$ 的情况即可。转化为 $\sum_{i=1}^n c_{1_i}d_i>0$。其中 $c_{1_i}$ 为系数,$c_1=[1,0,-1,-2,\cdots,-2,-1]$。
如果我们确定了 $d_{2\cdots n}$,通过以上两个条件,即可确定 $d_1$ 的取值范围。
条件 $1$:$d_1\le n-1-\sum_{i=2}^n d_i$。
条件 $2$:$d_1>\sum_{i=2}^n c_{2_i}d_i$,$c_2=[0,1,2,\cdots,2,1]$。
而 $d_1$ 原本有 $0\sim n-1$ 共 $n$ 个取值,受到两个条件的限制,就只有 $n-\sum_{i=2}^n c_{3_i}d_i$ 个取值,$c_3=[1,2,3,\cdots,3,2]$。也就是只要求出后面的 $\sum$ 取到每个小于 $n$ 的值的方案数即可。
而这实际上就是一个完全背包。
时间复杂度 $O(n^2)$。
$code$
1 |
|