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

文章讲述了如何使用动态规划和低比特操作解决一个关于排列组合的数学问题,涉及化简公式、特殊范围分析(如1-3、4-8、9-13等)、状态转移方程的构建以及针对大数场景的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绝世好题。逐步推导部分分逼近正解。

题解稍长,请耐心读完。


题目大意:给定序列 a={1,2,…n}a=\lbrace1,2,\dots n\rbracea={1,2,n},求 n!n!n! 种排列中 ∑i=1n∑j=in∑k=ij1+log⁡2lowbit⁡(ai)\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) 的第 kkk 小值。

照搬具体范围如下:


【数据范围】

本题各测试点时间限制不相同。具体地,每个点的时间限制为 max⁡(q×0.5,2) s\max(q\times 0.5, 2)\ \rm{s}max(q×0.5,2) s

测试点编号nnnk≤k \leqk$q = $
1∼31 \sim 313≤10\leq 1010n!n!n!222
4∼84 \sim 848≤103\leq 10^3103222777
9∼139 \sim 13913∈[105,106]\in [10^5, 10^6][105,106]min⁡(1018,n!)\min(10^{18}, n!)min(1018,n!)777
14∼1714 \sim 171417≤106\leq 10^6106min⁡(1018,n!)\min(10^{18}, n!)min(1018,n!)777
18∼2518 \sim 251825≤1018\leq 10^{18}1018min⁡(1018,n!)\min(10^{18}, n!)min(1018,n!)101010

题解:

显然地,式子可以化简成 ∑i=1ni×(n−i+1)(1+log⁡2lowbit⁡(ai))\sum_{i=1}^ni\times (n-i+1)(1+\log_2{\operatorname{lowbit}(a_i)})i=1ni×(ni+1)(1+log2lowbit(ai))
为了描述方便,将 aia_iai 赋值为 (1+log⁡2lowbit⁡(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_ii=1ni×(ni+1)×ai

对于 1∼31\sim 313 测试点,直接暴力求出 n!n!n! 种取值即可,不再赘述。
对于 4∼84\sim 848 测试点,发现 kkk 极小,

  • 考虑 k=1k=1k=1,由小奥得,设序列 bbbbi=i×(n−i+1)b_i=i\times (n-i+1)bi=i×(ni+1),答案即为 aaa 中最小的 aia_iai 乘上 bbb 中最大的 bib_ibi 加上 aaa 中次小的 aia_iai 乘上 bbb 中次大的 bib_ibi,以此类推求和。
  • 考虑 k=2k=2k=2,设 k=1k=1k=1aaa 的答案序列为 AAA,发现由于 b1=bnb_1=b_nb1=bn ,只需调换 A1,AnA_1,A_nA1,An 位置即可,答案大小不变,仍为最小值。

对于 9∼139\sim 13913 测试点, 受 4∼84\sim 848 测试点启发,可以发现 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 39n39 时,AAA 中光是 111 的个数就达到了 202020,同构数超过了 101810^{18}1018,所以对于该段测试点,答案与 k=1k=1k=1 时相等,O(n)O(n)O(n) 计算即可。

对于 14∼1714\sim 171417 测试点,手算一下发现同构数小于等于 101810^{18}1018nnn 上界为 282828,因此我们只需计算 n≤28n\le28n28 时第 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[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],其中 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[ 1 的个数][ 2 的个数][ 3 的个数][ 4 的个数][ 5 的个数][i],记得考虑乘上相同 aja_jaj 的排列情况,累加的和超过 kkk 时立刻得到答案为 iii

对于 18∼2518\sim 251825 测试点,唯一的问题在于 nnn 极大时如何处理,由于 aaa 的取值不超过 log⁡n\log nlogn,可以 log⁡n\log nlogn 时间内求出每个不同 aia_iai 的个数,然后推式子求答案即可。

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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值