绝世好题。逐步推导部分分逼近正解。
题解稍长,请耐心读完。
题目大意:给定序列 a = { 1 , 2 , … n } a=\lbrace1,2,\dots n\rbrace a={1,2,…n},求 n ! n! n! 种排列中 ∑ i = 1 n ∑ j = i n ∑ k = i j 1 + log 2 lowbit ( a i ) \sum_{i=1}^n\sum_{j=i}^n\sum_{k=i}^{j}1+\log_2{\operatorname{lowbit}(a_i)} ∑i=1n∑j=in∑k=ij1+log2lowbit(ai) 的第 k k k 小值。
照搬具体范围如下:
【数据范围】
本题各测试点时间限制不相同。具体地,每个点的时间限制为 max ( q × 0.5 , 2 ) s \max(q\times 0.5, 2)\ \rm{s} max(q×0.5,2) s。
测试点编号 | n n n | k ≤ k \leq k≤ | $q = $ |
---|---|---|---|
1 ∼ 3 1 \sim 3 1∼3 | ≤ 10 \leq 10 ≤10 | n ! n! n! | 2 2 2 |
4 ∼ 8 4 \sim 8 4∼8 | ≤ 1 0 3 \leq 10^3 ≤103 | 2 2 2 | 7 7 7 |
9 ∼ 13 9 \sim 13 9∼13 | ∈ [ 1 0 5 , 1 0 6 ] \in [10^5, 10^6] ∈[105,106] | min ( 1 0 18 , n ! ) \min(10^{18}, n!) min(1018,n!) | 7 7 7 |
14 ∼ 17 14 \sim 17 14∼17 | ≤ 1 0 6 \leq 10^6 ≤106 | min ( 1 0 18 , n ! ) \min(10^{18}, n!) min(1018,n!) | 7 7 7 |
18 ∼ 25 18 \sim 25 18∼25 | ≤ 1 0 18 \leq 10^{18} ≤1018 | min ( 1 0 18 , n ! ) \min(10^{18}, n!) min(1018,n!) | 10 10 10 |
题解:
显然地,式子可以化简成
∑
i
=
1
n
i
×
(
n
−
i
+
1
)
(
1
+
log
2
lowbit
(
a
i
)
)
\sum_{i=1}^ni\times (n-i+1)(1+\log_2{\operatorname{lowbit}(a_i)})
∑i=1ni×(n−i+1)(1+log2lowbit(ai))。
为了描述方便,将
a
i
a_i
ai 赋值为
(
1
+
log
2
lowbit
(
a
i
)
(1+\log_2{\operatorname{lowbit}(a_i)}
(1+log2lowbit(ai),原式化为
∑
i
=
1
n
i
×
(
n
−
i
+
1
)
×
a
i
\sum_{i=1}^ni\times (n-i+1)\times a_i
∑i=1ni×(n−i+1)×ai。
对于
1
∼
3
1\sim 3
1∼3 测试点,直接暴力求出
n
!
n!
n! 种取值即可,不再赘述。
对于
4
∼
8
4\sim 8
4∼8 测试点,发现
k
k
k 极小,
- 考虑 k = 1 k=1 k=1,由小奥得,设序列 b b b, b i = i × ( n − i + 1 ) b_i=i\times (n-i+1) bi=i×(n−i+1),答案即为 a a a 中最小的 a i a_i ai 乘上 b b b 中最大的 b i b_i bi 加上 a a a 中次小的 a i a_i ai 乘上 b b b 中次大的 b i b_i bi,以此类推求和。
- 考虑 k = 2 k=2 k=2,设 k = 1 k=1 k=1 时 a a a 的答案序列为 A A A,发现由于 b 1 = b n b_1=b_n b1=bn ,只需调换 A 1 , A n A_1,A_n A1,An 位置即可,答案大小不变,仍为最小值。
对于
9
∼
13
9\sim 13
9∼13 测试点, 受
4
∼
8
4\sim 8
4∼8 测试点启发,可以发现
A
n
s
Ans
Ans 为最小值的答案实际上有很多,
设序列
A
,
B
A,B
A,B 分别为
a
,
b
a,b
a,b 排序后的序列,容易发现
A
i
A_i
Ai 的取值极小,考虑计算答案同为最小值的方案数,即计算与序列
A
A
A 同构的序列总数,易得答案为
A
i
A_i
Ai 中每个值个数的阶乘的乘积,举个例子,设
A
=
{
1
,
1
,
1
,
1
,
1
,
2
,
2
,
3
,
4
}
A=\lbrace1,1,1,1,1,2,2,3,4\rbrace
A={1,1,1,1,1,2,2,3,4},同构数即
5
!
×
2
!
×
1
!
×
1
!
=
240
5!\times 2!\times 1!\times 1!=240
5!×2!×1!×1!=240 种。
可以发现当
n
≥
39
n\ge 39
n≥39 时,
A
A
A 中光是
1
1
1 的个数就达到了
20
20
20,同构数超过了
1
0
18
10^{18}
1018,所以对于该段测试点,答案与
k
=
1
k=1
k=1 时相等,
O
(
n
)
O(n)
O(n) 计算即可。
对于 14 ∼ 17 14\sim 17 14∼17 测试点,手算一下发现同构数小于等于 1 0 18 10^{18} 1018 的 n n n 上界为 28 28 28,因此我们只需计算 n ≤ 28 n\le28 n≤28 时第 k k k 小值的大小,此时 A A A 的取值只有 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5 五种( A A A 与上文含义相同),考虑 dp 求方案数,设 f [ a ] [ b ] [ c ] [ d ] [ e ] [ i ] f[a][b][c][d][e][i] f[a][b][c][d][e][i] 表示 A A A 中前 a + b + c + d + e a+b+c+d+e a+b+c+d+e 位中 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5 的个数分别是 a , b , c , d , e a,b,c,d,e a,b,c,d,e 且此时总价值为 i i i 的方案数 (不考虑同构情况),可得转移方程为
f [ a ] [ b ] [ c ] [ d ] [ e ] [ i ] = f [ a − 1 ] [ b ] [ c ] [ d ] [ e ] [ i − s u m × ( n − s u m + 1 ) ] + f [ a ] [ b − 1 ] [ c ] [ d ] [ e ] [ i − s u m × ( n − s u m + 1 ) × 2 ] + f [ a ] [ b ] [ c − 1 ] [ d ] [ e ] [ i − s u m × ( n − s u m + 1 ) × 3 ] + f [ a ] [ b ] [ c ] [ d − 1 ] [ e ] [ i − s u m × ( n − s u m + 1 ) × 4 ] + f [ a ] [ b ] [ c ] [ d ] [ e − 1 ] [ i − s u m × ( n − s u m + 1 ) × 5 ] \begin{aligned} f[a][b][c][d][e][i] &=f[a-1][b][c][d][e][i-sum\times (n-sum+1)]\\ &+f[a][b-1][c][d][e][i-sum\times (n-sum+1)\times 2]\\ &+f[a][b][c-1][d][e][i-sum\times (n-sum+1)\times 3]\\ &+f[a][b][c][d-1][e][i-sum\times (n-sum+1)\times 4]\\ &+f[a][b][c][d][e-1][i-sum\times (n-sum+1)\times 5] \end{aligned} f[a][b][c][d][e][i]=f[a−1][b][c][d][e][i−sum×(n−sum+1)]+f[a][b−1][c][d][e][i−sum×(n−sum+1)×2]+f[a][b][c−1][d][e][i−sum×(n−sum+1)×3]+f[a][b][c][d−1][e][i−sum×(n−sum+1)×4]+f[a][b][c][d][e−1][i−sum×(n−sum+1)×5],其中 s u m = a + b + c + d + e sum=a+b+c+d+e sum=a+b+c+d+e。
注意到 f [ 0 ] [ 0 ] [ 0 ] [ 0 ] [ 0 ] [ 0 ] = 1 f[0][0][0][0][0][0]=1 f[0][0][0][0][0][0]=1。
想到状态的设置,式子还是比较好推的,不建议细看上面的式子。
求解的时候从 i = 0 i=0 i=0 向上累加 f [ a 中 1 的个数 ] [ a 中 2 的个数 ] [ a 中 3 的个数 ] [ a 中 4 的个数 ] [ a 中 5 的个数 ] [ i ] f[\text{a 中 1 的个数}][\text{a 中 2 的个数}][\text{a 中 3 的个数}][\text{a 中 4 的个数}][\text{a 中 5 的个数}][i] f[a 中 1 的个数][a 中 2 的个数][a 中 3 的个数][a 中 4 的个数][a 中 5 的个数][i],记得考虑乘上相同 a j a_j aj 的排列情况,累加的和超过 k k k 时立刻得到答案为 i i i。
对于 18 ∼ 25 18\sim 25 18∼25 测试点,唯一的问题在于 n n n 极大时如何处理,由于 a a a 的取值不超过 log n \log n logn,可以 log n \log n logn 时间内求出每个不同 a i a_i ai 的个数,然后推式子求答案即可。
推式子部分明显比 dp 部分容易,毕竟考试时没有选手拿 68pts 的部分分。
在一步步攻取部分分的努力下,最后这题就 AC 了,这是这题得出的最重要的方法。