02 Nov 2021 2854字 10分 次 数学 and DP
如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY-NC-SA 4.0 (除特别声明或转载文章外) 注:完美为 perfect,好的为 good。好的序列为 min×max≥∑ 的序列,完美的序列为每个子序列都好的序列。
首先,我们考虑排好序的完美序列,任意完美的序列的任意排列都是完美的。
然后我们发现:
定理 1 一个排好序的序列是完美的当且仅当其每个子区间都是好的。
证明:枚举每个 i 和 j,我们发现 min×max=ai×aj 固定 ∑ 最大时即为选择整个子区间 [i,j] 时。
定理 2 一个排好序的序列是完美的当且仅当其每个前缀都是好的。
证明:此时,aiaj≥a1aj≥k=1∑jaj≥k=i∑jaj,则有每个前缀是好的可以推出每个子区间是好的。
定理 3 ∀k,ak≥k。
证明:若 ak<k,i=1∑kai≥ka1>a1ak,违反定理 2。
定理 4 若 ak=k,则 ∀i≤k,ai=k。
证明:由定理 2 a1ak=ka1≥i=1∑kai,又因为 i=1minkai=a1,所以 ka1≤i=1∑kai,所以 ka1=i=1∑kai ,所以 ∀i≤k,ai=k。
定理 5 若 an=n+1,∃i<n,ai≥i+1,且 a1∼n 为好序列,则前缀 a1∼i 为好序列。
证明:(n+1)a1≥k=1∑nak,则 a1≥k=1∑n(ak−a1)≥k=1∑i(ak−a1),则 aia1≥(i+1)a1≥k=1∑iak。
分两个情况讨论 an=n 和 an=n+1,前一种情况是平凡的(因为定理 4),我们只考虑 an=n+1,则此时 a 为完美的充要条件为:
- ∀i≤a1,a1≤ai≤n+1;
- ∀i>a1,i+1≤ai≤n+1;
- i=1∑n(ai−a1)≤a1。
但是,我们要求的序列是没有排序的,让我们把每个数都减去 a1,然后称之为 b。
枚举 a1,则我们要计数这样的数列 b。
- 0≤bi≤n+1−a1;
- ∑b≤a1;
- 至少存在 i(1≤i≤n−a1) 个数 ≥n+2−i−a1。
我们设 fi,s,k 为已经确定 i 个元素,当前和为 s,要放置值等于 k 的数的方案数,枚举放了几个 k,fi,s,k=j∑j!fi+j,s+jk,k−1,边界为 i=n 时,值为 n! 。
DP 应该是 O(n3logn)(log 是枚举 j 的调和级数),加上枚举 ai 的复杂度,复杂度为 O(n4logn)。
定理 6 a1<n−2n 时,答案为 0。
证明:因为条件至少存在 i(1≤i≤n−a1) 个数 ≥n+2−i−a1,若 a1<n−2n,∑bi>n+1>a1,所以无解。
复杂度 O(n3nlogn),可以通过本题。