纸牌洗牌难题:推导位置映射公式与实现 k 次洗牌后牌位查询
洗牌操作将牌堆分成两半,交叉合并。 n 张牌初始排列为 1, 2, …, n。 一次洗牌后,位置 x 上的牌会移动到新位置 f(x)。 推导映射公式: 设牌在洗牌前的位置为 x(1 ≤ x ≤ n)。 n 是偶数,令 m = n / 2。 洗牌过程: 前一半牌 a₁, a₂, …, aₘ 对应原位置 1, 2, …, m。 后一半牌 aₘ₊₁, aₘ₊₂, …, aₙ 对应原位置 m+1, m+2, …, n。 交叉合并后,新序列为: 原位置 1, m+1, 2, m+2, …, m, n。 观察位置映射: - 原位置 x(1 ≤ x ≤ m)在新序列中排在第 2x - 1 个位置。 - 原位置 x(m+1 ≤ x ≤ n)在新序列中排在第 2(x - m) 个位置。 因此: f(x) = 2x - 1,当 1 ≤ x ≤ m。 f(x) = 2(x - m),当 m+1 ≤ x ≤ n。 等价形式(便于计算): f(x) = (2x) mod (n+1),当 1 ≤ x ≤ n-1 且 n 为偶数时,注意 n+1 是奇数。 验证: x ≤ m 时,2x ≤ n,2x mod (n+1) = 2x,但我们需要 2x-1,所以不对。 直接使用分段公式即可。 洗牌 k 次后,初始位置 i 的牌移动到了哪个位置? 题目要求输出洗牌 k 次后第 i 张牌的编号,即初始编号为多少的牌移动到了位置 i。 设初始编号 = 位置编号,初始时位置 p 上是牌 p。 洗牌一次,位置 p 上的牌移动到 f(p)。 洗牌 k 次,位置 p 上的牌移动到 f^k(p)。 我们要求的是:洗牌 k 次后,位置 i 上的牌的初始编号,即求 g = f^{-k}(i)。 因此需要求 f 的逆映射。 由 f: 如果 f(x) = y,那么: 情况 1:y 是奇数,y = 2x - 1 ⇒ x = (y+1)/2。 情况 2:y 是偶数,y = 2(x - m) ⇒ x = y/2 + m。 所以逆映射: h(y) = (y+1)/2,当 y 是奇数。 h(y) = y/2 + m,当 y 是偶数。 洗牌 k 次后位置 i 上的牌初始编号 = h^k(i)。 n, k 最大 1e5,直接模拟 k 次逆映射即可,O(k) 时间。 样例 n=6, k=2, i=5: m = 3。 第一次逆映射:i=5 奇数 ⇒ h=3。 第二次逆映射:i=3 奇数 ⇒ h=2。 输出 2,符合样例。 代码实现: ```python n, k, i = map(int, input().split()) m = n // 2 pos = i for _ in range(k): if pos % 2 == 1: pos = (pos + 1) // 2 else: pos = pos // 2 + m print(pos) ``` ######[AI问答 | 810点数解答 | 2026-01-06 17:43:32]
- 数轴旅行:从原点出发,能否到达目标位置?(字节豆包 | 225点数解答 | 2026-01-23 19:51:03)45
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)344
- 解决 consoleapplication40.cpp 中 buildtree 模板参数推导失败错误的方法(字节豆包 | 138点数解答 | 2024-11-10 23:42:06)239
- Java 实现:从点类到圆类,计算圆心坐标(50,30)、半径 4 的圆周长与面积(字节豆包 | 246点数解答 | 2024-11-11 16:36:30)336
- 补全含错误代码:Vue结合Element UI组件实现查询、新增及表格展示功能 ( | 400点数解答 | 2023-12-19 15:20:50)432
- 单线程频繁查ClickHouse致CPU飙升?这些优化方案速看!(DeepSeek | 491点数解答 | 2025-02-13 17:49:54)228
- MySQL:巧用 NOT LIKE 查询字段不包含特定字符串及注意要点 (DeepSeek | 264点数解答 | 2025-02-13 18:25:01)179
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)312
- Python Tkinter 代码剖析:GUI 程序搭建与窗口居中函数解析(字节豆包 | 314点数解答 | 2024-08-02 14:49:22)332
- 巧用 CDN 搭建含照片轮播、社交链接与 AI 对话的单页个人网页(字节豆包 | 485点数解答 | 2024-10-28 23:31:13)246
- 巧用 CDN 搭建单页个人网页:含照片轮播、社交链接与 AI 对话界面 (阿里通义 | 1752点数解答 | 2024-10-28 23:32:45)234
- C++ 完整代码:实现书籍信息录入与列表管理(GPT | 2245点数解答 | 2024-12-18 09:06:13)262