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