【笔试刷题】淘天-2026.04.11-研发岗-改编真题
✅ 春招备战指南 ✅
💡 学习建议:
- 先尝试独立解题
- 对照解析查漏补缺
🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。
🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力
🤖 内容包含AI辅助生成,题解和代码均经过多轮验证,有问题欢迎评论
🌸 目前本专栏已经上线200+套真题改编解析,后续会持续更新的
春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗
淘天-2026.04.11-研发岗
题目总览
| 题号 | 题名 | 主要做法 | 难度 |
|---|---|---|---|
| 1 | 模乘循环数 | 状态模拟 + 判重 | 简单 |
| 2 | 逆转 | 贪心构造 | 中等 |
| 3 | 果酱平衡 | 分组 DP + 前缀差值 | 困难 |
这套研发岗的节奏是前面两题先把规律抓出来,最后一题再把限制压到统一模型里。第一题很直接,第二题要反着想筛选过程,第三题则要把“每行只能删前缀”拆成若干可选差值后再做最优转移。
1. 小兰的模乘循环数
问题描述
小兰在阿笠博士的实验台上放了一个数字显示器,初始值固定为 1。
接下来设备会反复执行下面这条更新规则:
因为每次都会取模,所以状态迟早会再次出现。
现在请你统计:从初始状态开始,整个过程一共会出现多少个不同的数。
输入格式
输入一行两个整数 k, m。
输出格式
输出一个整数,表示出现过的不同状态个数。
样例输入
2 10
样例输出
5
样例说明
状态序列依次是 1 -> 2 -> 4 -> 8 -> 6 -> 2 -> ...。
从第二次遇到 2 开始,后面的变化会重复,所以不同状态共有 1,2,4,8,6 这 5 个。
数据范围
0 <= k <= 10^61 <= m <= 10^6
题解
这一题不需要推复杂公式,直接照着转移规则往下走就够了。
如果某个状态第一次出现,我们把它记下来,然后继续转移到下一个状态;一旦某个值已经访问过,说明后续过程会进入循环,不会再产生新状态。
有一个细节要单独提一下:当 m = 1 时,第一次更新之后一定变成 0,但初始状态里的 1 也算出现过,所以答案是 2。
参考代码(Python)
import sys
def solve() -> None:
# Read input in ACM mode and build the answer directly.
k, m = map(int, sys.stdin.readline().split())
if m == 1:
print(2)
return
seen = bytearray(m)
cur = 1
cnt = 0
while not seen[cur]:
seen[cur] = 1
cnt += 1
cur = (cur * k) % m
print(cnt)
if __name__ == "__main__":
# Standard ACM entry.
solve()
2. 园子的逆转
问题描述
园子先写出了一个正整数序列 a,然后按下面的规则从左到右扫描它,得到一个保留下来的序列 b:
- 第一个数
a1一定保留; - 对于后面的每个位置
i,如果a[i - 1] + d <= a[i],那么a[i]会进入b; - 否则这个数会被丢掉。
现在只给你阈值 d 和最终留下来的序列 b。
你需要反过来构造一个合法的原序列 a,并满足:
- 长度尽量短;
- 在所有最短方案中,字典序尽量小。
题目保证一定存在解。
输入格式
第一行输入整数 T,表示测试组数。
每组数据包含两行:
- 第一行输入
n, d; - 第二行输入
n个整数,表示序列b。
输出格式
对每组数据输出两行:
- 第一行输出构造出的长度;
- 第二行输出构造出的序列。
样例输入
2
3 2
5 6 8
4 0
2 1 1 3
样例输出
4
5 1 6 8
5
2 1 1 1 3
样例说明
第一组里,5 后面不能直接接 6,因为 5 + 2 > 6。
所以需要先插一个会被跳过的数。取最小正整数 1 时,5 + 2 > 1,而 1 + 2 <= 6,于是 6 就能被顺利保留下来。
第二组里 d = 0,判断条件变成“前一个数不大于当前数”。
在两个保留值之间补一个最小的 1,可以同时满足最短和字典序最小。
数据范围
1 <= T <= 10^41 <= n <= 2 * 10^50 <= d < 10^91 <= b[i] <= 10^9- 所有测试数据的
n之和不超过2 * 10^5
题解
看相邻两个保留值之间要发生什么就行。
假设当前已经让 b[i - 1] 出现在原序列末尾,现在想让 b[i] 被保留下来:
- 如果
b[i - 1] + d <= b[i],那就直接把b[i]接上; - 如果不满足,说明
b[i]不能紧跟在b[i - 1]后面,否则它会被跳过。
这时至少要插入一个额外数字。
为了让总长度最短,我们只插一个数;为了让字典序最小,这个数应当尽量小,取 1 最合适。
于是整题就成了一个很直接的贪心:
- 能直接接,就直接接;
- 不能直接接,就先插入
1,再放当前这个保留值。
参考代码(Python)
import sys
def solve() -> None:
input = sys.stdin.readline
t = int(inpu
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力


华为HUAWEI成长空间 651人发布