P9838 挑战 NPC IV ( luogu NOIP模拟赛T3 )

21 篇文章 0 订阅
13 篇文章 0 订阅
绝世好题。逐步推导部分分逼近正解。

题解稍长,请耐心读完。


题目大意:给定序列 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=1nj=ink=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 13 ≤ 10 \leq 10 10 n ! n! n! 2 2 2
4 ∼ 8 4 \sim 8 48 ≤ 1 0 3 \leq 10^3 103 2 2 2 7 7 7
9 ∼ 13 9 \sim 13 913 ∈ [ 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 1417 ≤ 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 1825 ≤ 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×(ni+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×(ni+1)×ai

对于 1 ∼ 3 1\sim 3 13 测试点,直接暴力求出 n ! n! n! 种取值即可,不再赘述。
对于 4 ∼ 8 4\sim 8 48 测试点,发现 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×(ni+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 913 测试点, 受 4 ∼ 8 4\sim 8 48 测试点启发,可以发现 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 n39 时, 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 1417 测试点,手算一下发现同构数小于等于 1 0 18 10^{18} 1018 n n n 上界为 28 28 28,因此我们只需计算 n ≤ 28 n\le28 n28 时第 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[a1][b][c][d][e][isum×(nsum+1)]+f[a][b1][c][d][e][isum×(nsum+1)×2]+f[a][b][c1][d][e][isum×(nsum+1)×3]+f[a][b][c][d1][e][isum×(nsum+1)×4]+f[a][b][c][d][e1][isum×(nsum+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[ 1 的个数][ 2 的个数][ 3 的个数][ 4 的个数][ 5 的个数][i],记得考虑乘上相同 a j a_j aj 的排列情况,累加的和超过 k k k 时立刻得到答案为 i i i

对于 18 ∼ 25 18\sim 25 1825 测试点,唯一的问题在于 n n n 极大时如何处理,由于 a a a 的取值不超过 log ⁡ n \log n logn,可以 log ⁡ n \log n logn 时间内求出每个不同 a i a_i ai 的个数,然后推式子求答案即可。

推式子部分明显比 dp 部分容易,毕竟考试时没有选手拿 68pts 的部分分。

在一步步攻取部分分的努力下,最后这题就 AC 了,这是这题得出的最重要的方法。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值