2022年长春理工大学蓝桥杯校选赛题解
A.算数
计算机基础知识 & 小学数学题
一个 int 变量 4B ,1MB=1024KB,1KB=1024B
512MB 能创建 512∗1024∗1024/4=134217728 个 int 变量
Answer:134217728
B.龙神的工资
高中数学&组合数学-插板法
题目可以抽象为 n 个相同的小球,放进 m 个不同的箱子,箱子允许为空,答案即为 Cn+m−1m−1
答案对 109+9 取模。
Answer:863690645
C.龙神的口头禅
高中/大学数学&容斥原理&组合数
设命题 A 为字母 l 至少出现一次的方案数,命题 B 为 字母 z 至少出现一次的方案数,命题 C 为 字母 q 至少出现一次的方案数,命题 D 为字母 n 至少出现一次的方案数。那么所求答案就抽象成就 A∩B∩C∩D。正面计算很复杂,利用容斥原理可得
A∩B∩C∩D=Aˉ∪Bˉ∪Cˉ∪Dˉ−(Aˉ∪Bˉ∪Cˉ+Aˉ∪Bˉ∪Dˉ+Aˉ∪Cˉ∪Dˉ+Bˉ∪Cˉ∪Dˉ)+(Aˉ∪Bˉ+Aˉ∪Cˉ+Aˉ∪Dˉ+Bˉ∪Cˉ+Bˉ∪Dˉ+Cˉ∪Dˉ)−(Aˉ+Bˉ+Cˉ+Dˉ)
由于A、B、C、D方法数一致,所以上式可以简化为 A∩B∩C∩D=C44×(Aˉ∪Bˉ∪Cˉ∪Dˉ)−C43×(Aˉ∪Bˉ∪Cˉ)+C42×(Aˉ∪Bˉ)−C41×(Aˉ)
如果实在想不到,也可以使用 dfs ,搜索结果,大概需要 1 分钟左右出结果。
Answer:14676024
D.好客龙神
大学编程课内题&求约数个数
对于每个数 x ,使用朴素算法 O(x) 的求约数个数,大概要跑 2 年。
对于每个数 x,使用略加优化的算法 O(x) 的求约数个数,大概要跑 2 分钟。
对于每个数 x ,使用 Eratosthenes 筛法 O(nlog(n)) 的求约数个数,大概要跑 2 毫秒
对于每个数 x ,使用 线性筛法 O(n) 的求约数个数,大概要跑 0.2 毫秒
之后从 1 枚举到 20211207 比较每个数的约数个数和之前的约数个数最大值,若当前的约数个数大于等于之前的约数个数,则答案+1
Answer:135
E.龙神的时钟魔法
模拟&数学:
钟表上秒针一秒钟转6°,时针一小时转30°,即时针一秒钟转1201°,一天86400秒,直接模拟时针秒针何时夹角α≤30°即可。可能会卡精度,可以将角度同时乘120倍即可没有浮点数运算。
Answer:14402
F.这真的是一道很简单很简单的题
输出输出&加减乘除运算
对于 30% 的做法,直接读入两个 int 类型的 x,p,输出 x%p即可
对于 100% 的做法
Python 可直接输出 x%p
Java 可使用大整数类,读入 x,p 再输出 x%p
C++ :对于一个数 14324, 可以分解为 ((((((0∗10)+1)∗10)+4)∗10+3)∗10+2)∗10+4,那么,对于 x ,以字符串的形式读入,对于每一位迭代处理,取模即可,需要注意一下 longlong 溢出。
G.Super赛亚人
排序&前缀和
要想怒气值最快到达 k 那么一定优先选大数,对给定的 n 个数排序,从大到小进行累加,如果累加和大于 k 则输出累加的个数,若 n 个数都累加了还没有达到 k ,那么则输出 −1 。
对于 40% 的做法,可以使用 O(n2) 的排序算法进行排序。
对于100% 的做法,可以使用 O(nlog(n)) 的排序算法进行排序。
H.龙神的竖锯解构
数据结构&线段树
对于 40% 的做法,模拟题目中的操作,加减乘除运算,累和输出即可。
对于 100% 的做法,已知每个数 ai 小于等于 109 那么对于 ai 进行除法操作,最多不超过 30 次就可以把 ai 变成 0 ,考虑线段树维护区间最大值以及区间和,若当前区间最大值为 0 ,那么则不对当前区间进行更新,否则对每个待修改值进行单点更新,时间复杂度 O(30∗nlog(n))。
I.龙神的口头禅集合
动态规划&计数问题
**对于30%的测试点:**因为 n 小于 10,所以可以枚举所有子序列,一共是 2n 个子序列,复杂度 O(2n)
**对于70%的测试点:**考虑动态规划,用 dp[i] 表示以 i为结尾位置的所有子序列,考虑如何去重,设该字符上次出现位置为 q,那么 q 前面的所有子序列都以 q 结尾过一次,所以 q 前面的字符串无法以 i 结尾。所以转移方程dp[i]=∑x=pidp[x],如果 i 位置的字符是首次出现,dp[i]=dp[i]+1,复杂度O(n2)
**对于100%的测试点:**考虑优化动态规划,我们发现每个点的 dp 转移,都是对于一段区间求和,所以我们可以使用前缀和来优化,只需要记录每个字符首次出现的位置即可。复杂度 O(n)。也可以从后往前考虑,设 all 为到当前字符之前,所有本质不同的子序列数量,设 cntx 为到当前字符之前,以 x 开始的的子序列个数,那么以当前字符 ch 开始的子序列数量为 all−cnt[ch]+1,每次更新 all,cnt[ch],时间复杂度为O(n)
J.祖龙传说
树&数据结构&倍增&差分&前缀和&dfs相关
给出各边的关系,以 1 为根节点,建一棵有根树。
对于 40% 的做法,对每个点 x 向上暴力跳 k 个父节点同时进行单点修改,到 1 节点仍不满 k 个节点,则终止跳跃。
对于10% 链的做法,维护差分数组,最后求前缀和输出即可。
对于 10% 菊花图的做法,因为对于每个节点,祖先数目小于等于1,所以最朴素的做法可过。
对于 100% 的做法,倍增求每个点 x 的 k 级祖先是哪一个点,若 k 级祖先超过 1 则将祖先设置为 1,树上点差分,对于差分数组 numfa[x]+=c,numfa[fa[x][k]][0]−=c,对树进行 dfs 求子树和输出即可,时间复杂度 O(nlog(n))。