报数游戏升级!含 7 倍数禁报,代码高效解决查询难题
```cpp #include <iostream> #include <vector> using namespace std; const int MAXN = 1e7 + 10; // 标记一个数是否含有数字7 bool hasSeven[MAXN]; // 标记一个数是否能被报出 bool canSpeak[MAXN]; // 记录下一个能报出的数 int nextSpeak[MAXN]; // 初始化函数,预处理所有信息 void init() { // 初始化所有数都能报出 for (int i = 1; i < MAXN; i++) { canSpeak[i] = true; } // 标记所有含有数字7的数 for (int i = 1; i < MAXN; i++) { int num = i; while (num > 0) { if (num % 10 == 7) { hasSeven[i] = true; break; } num /= 10; } } // 将含有数字7的数的倍数标记为不能报出 for (int i = 1; i < MAXN; i++) { if (hasSeven[i]) { for (int j = i; j < MAXN; j += i) { canSpeak[j] = false; } } } // 预处理下一个能报出的数 int last = MAXN; // 记录上一个能报出的数 for (int i = MAXN - 1; i >= 1; i--) { if (canSpeak[i]) { nextSpeak[i] = last; last = i; } } } int main() { // 初始化预处理 init(); int T; cin >> T; while (T--) { int x; cin >> x; // 如果x不能报出,输出-1 if (!canSpeak[x]) { cout << -1 << endl; } else { // 输出下一个能报出的数 cout << nextSpeak[x] << endl; } } return 0; } ``` 代码解释: 1. 预处理阶段: - `hasSeven`数组标记每个数是否含有数字7 - `canSpeak`数组标记每个数是否能被报出(初始都为true) - 遍历所有数,将含有数字7的数的所有倍数标记为不能报出 2. 查询阶段: - 如果输入的数`x`不能报出(`canSpeak[x] == false`),直接输出`-1` - 否则输出`nextSpeak[x]`,即下一个能报出的数 3. 时间复杂度: - 预处理:O(n log n),使用类似埃氏筛的方法 - 查询:O(1),直接查表 - 总复杂度:O(n log n + T),适合题目数据范围 4. 空间复杂度: - O(n),需要三个大小为MAXN的数组 关键点: - 使用筛法思想,避免对每个查询都重新计算 - 预处理下一个能报出的数,实现O(1)查询 - 注意数组大小要开到10^7+10,满足题目最大数据范围 ######[AI问答 | 716点数解答 | 2026-01-18 12:48:49]
- 超燃年会来袭!诗舞歌戏轮番上阵,共赴欢乐盛宴! (字节豆包 | 206点数解答 | 2025-01-08 10:59:43)357
- 巴黎奥运:中国女排淘汰赛对决土耳其,朱婷成致胜关键!(字节豆包 | 448点数解答 | 2024-08-06 15:59:48)176
- 补全含错误代码:Vue结合Element UI组件实现查询、新增及表格展示功能 ( | 400点数解答 | 2023-12-19 15:20:50)448
- 单线程频繁查ClickHouse致CPU飙升?这些优化方案速看!(DeepSeek | 491点数解答 | 2025-02-13 17:49:54)244
- MySQL:巧用 NOT LIKE 查询字段不包含特定字符串及注意要点 (DeepSeek | 264点数解答 | 2025-02-13 18:25:01)190
- 探秘各类游戏:多样玩法带来不同乐趣!(字节豆包 | 77点数解答 | 2025-05-04 01:10:38)187
- Python代码实现:带窗口、滚轴、重力、惯性与怪物的类马里奥游戏(字节豆包 | 964点数解答 | 2025-06-13 19:11:12)211
- 游戏大观:从类型到平台,追溯其发展与魅力!(字节豆包 | 268点数解答 | 2025-07-10 17:57:48)197
- C++ 实现:自由定制,开启独特棋类游戏设计之旅!(字节豆包 | 1441点数解答 | 2025-12-28 15:02:52)60
- C++ 实现:自由定制,打造专属棋类游戏盛宴!(字节豆包 | 2307点数解答 | 2025-12-28 15:04:23)59
- C++实现:自由定制的多元棋类游戏,规则齐全玩法多样!(字节豆包 | 2601点数解答 | 2025-12-28 15:12:21)53
- Python实现计算输入整数各个数位之和(字节豆包 | 129点数解答 | 2026-03-03 19:12:56)34