Content:模拟赛
Date:2025.8.15
Problem-A 图书配对
题目描述
给定 n 本图书,定义 merge(ai,aj) 表示 ai, aj 直接拼接得到的结果,求满足 merge(ai,aj)∣9 的个数(一个数只能取一次)。
解题思路
我们可以运用小学奥数的知识,如果一个数能被 9 整除,当且仅当这个数的各个数位之和能被 9 整除,知道这个之后就是一个很经典的问题了。
提交记录:Link
Problem-B 菜品搭配
题目描述
给定数组 a,求 i=0∑n−2j=i+1∑n−1k=j+1∑n(ai⊕aj)×(aj⊕ak)。
解题思路
由于是二进制意义下的异或运算,很容易想到拆位,计算每一位的贡献。而且求的是三元组 (i,j,k),所以我们枚举 j 的位置,考虑 j 左右两边的贡献。
对于异或 相同为 0,不同为 1 的运算法则,我们可以发现,i,k 对于 j 的贡献是左右两边与 j 不相同的位置的个数的乘积,所以我们对于每一个位置计算贡献即可。
涂胶记录:Link
Problem-C 课程推荐
题目大意
给你一个数组 a,其中 ai 表示到达 i 这个位置后你可以到达 [i+1,ai] 中的任何一个位置,求 ∀i,j 互相可达的最小步数之和。
解题思路
赛时没有想到是 dp,直接写了个 Floyd (20pts) + 部分分(10pts)。
正解是定义 di,j 表示从 i 到 j 需要的最少步数。容易发现:
- 若 j∈[i+1,ai],则 di,j=1。
- 若 j>ai,则 di,j=dk,j+1,其中 k 表示 maxt∈[i+1,ai]at 所在的位置。
然后记 fi=j=i∑ndi,j,则 fi=fp+(n−i)−(ai−p)。答案即为 i=0∑nfi。
终于结束啦喵~