魔术《守岁共此时》揭秘

魔术介绍

魔术《守岁共此时》是 2024 2024 2024 年春节联欢晚会上刘谦表演的魔术。刘谦共表演了两个魔术,其中的第二个魔术为观众共同参与的魔术。

第二个魔术的操作内容如下。

  1. 任取 4 4 4 张牌,打乱顺序。
  2. 4 4 4 张牌撕开,变成 8 8 8 个小张,按同一个方向放置。放置之后得到 8 8 8 个小张组成的牌叠,上面 4 4 4 张为 4 4 4 张牌的上半部分,下面 4 4 4 张为 4 4 4 张牌的下半部分,且上面 4 4 4 张与下面 4 4 4 张的相对顺序相同。
  3. 根据每个人的姓名字数 x x x,每次将牌叠最上面的牌放到最下面,重复 x x x 次该操作。
  4. 拿起牌叠最上面的 3 3 3 张牌,插进牌叠的中间任意位置。
  5. 拿起牌叠最上面的 1 1 1 张牌,藏在其他地方。
  6. 拿起牌叠最上面的 1 1 1 3 3 3 张牌,插进牌叠的中间任意位置。具体数量为:南方人拿 1 1 1 张,北方人拿 2 2 2 张,不确定者拿 3 3 3 张。
  7. 拿起牌叠最上面的 1 1 1 2 2 2 张牌,丢弃。具体数量为:男生拿 1 1 1 张,女生拿 2 2 2 张。
  8. 每次将牌叠最上面的牌放到最下面,重复 7 7 7 次该操作。
  9. 每次将牌叠最上面的牌放到最下面,然后把牌叠最上面的牌丢弃,直到剩下 1 1 1 张牌。由于第 7 7 7 步男生丢弃的牌比女生少 1 1 1 张,因此第 9 9 9 步男生需要多执行 1 1 1 次操作。
  10. 剩余的 1 1 1 张牌与第 5 5 5 步藏起的牌匹配。

魔术分析

4 4 4 张牌分别记为 A \text{A} A B \text{B} B C \text{C} C D \text{D} D,撕开后 A \text{A} A B \text{B} B C \text{C} C D \text{D} D 各有 2 2 2 张。经过前 2 2 2 步操作之后,牌叠顺序是 ABCDABCD \text{ABCDABCD} ABCDABCD,满足同一张牌的 2 2 2 个半张在牌叠中的距离为 4 4 4。本文中,牌叠顺序都是从上到下的顺序。

3 3 3 步操作后的牌叠顺序取决于 x x x 除以 4 4 4 的余数,具体如下。

  • x x x 除以 4 4 4 0 0 0 时,第 3 3 3 步操作后的牌叠顺序是 ABCDABCD \text{ABCDABCD} ABCDABCD

  • x x x 除以 4 4 4 1 1 1 时,第 3 3 3 步操作后的牌叠顺序是 BCDABCDA \text{BCDABCDA} BCDABCDA

  • x x x 除以 4 4 4 2 2 2 时,第 3 3 3 步操作后的牌叠顺序是 CDABCDAB \text{CDABCDAB} CDABCDAB

  • x x x 除以 4 4 4 3 3 3 时,第 3 3 3 步操作后的牌叠顺序是 DABCDABC \text{DABCDABC} DABCDABC

虽然可能有 4 4 4 种不同的牌叠顺序,但是都满足同一张牌的 2 2 2 个半张在牌叠中的距离为 4 4 4。以下考虑第 3 3 3 步操作后的牌叠顺序为 ABCDABCD \text{ABCDABCD} ABCDABCD 的情况,对于其他牌叠顺序的情况也适用。

4 4 4 步操作之后,牌叠最上面的牌与最下面的牌都是 D \text{D} D,中间的牌的顺序是任意的。

5 5 5 步操作将牌叠最上面的牌藏在其他地方,藏起的牌是 D \text{D} D。第 5 5 5 步操作之后,牌叠还有 7 7 7 张牌。

6 6 6 步操作会改变牌叠的上面 6 6 6 张牌的顺序,牌叠最下面的牌仍是 D \text{D} D。第 6 6 6 步操作之后,将牌叠顺序记为 EFGHIJD \text{EFGHIJD} EFGHIJD

7 7 7 步操作将牌叠最上面的 1 1 1 2 2 2 张牌丢弃,男生丢弃 1 1 1 张牌,女生丢弃 2 2 2 张牌。第 7 7 7 步操作之后,男生的牌叠还有 6 6 6 张牌,牌叠顺序是 FGHIJD \text{FGHIJD} FGHIJD,女生的牌叠还有 5 5 5 张牌,牌叠顺序是 GHIJD \text{GHIJD} GHIJD

8 8 8 步操作将牌叠最上面的 7 7 7 张牌放到最下面。第 8 8 8 步操作之后,男生的牌叠顺序是 GHIJDF \text{GHIJDF} GHIJDF,女生的牌叠顺序是 IJDGH \text{IJDGH} IJDGH

9 9 9 步操作时,男生需要丢弃 5 5 5 张牌,女生需要丢弃 4 4 4 张牌。男生和女生的每次操作之后的牌叠顺序变化如下。

  • 男生: GHIJDF → HIJDFG → IJDFG → JDFGI → DFGI → FGID → GID → IDG → DG → GD → D \text{GHIJDF} \rightarrow \text{HIJDFG} \rightarrow \text{IJDFG} \rightarrow \text{JDFGI} \rightarrow \text{DFGI} \rightarrow \text{FGID} \rightarrow \text{GID} \rightarrow \text{IDG} \rightarrow \text{DG} \rightarrow \text{GD} \rightarrow \text{D} GHIJDFHIJDFGIJDFGJDFGIDFGIFGIDGIDIDGDGGDD

  • 女生: IJDGH → JDGHI → DGHI → GHID → HID → IDH → DH → HD → D \text{IJDGH} \rightarrow \text{JDGHI} \rightarrow \text{DGHI} \rightarrow \text{GHID} \rightarrow \text{HID} \rightarrow \text{IDH} \rightarrow \text{DH} \rightarrow \text{HD} \rightarrow \text{D} IJDGHJDGHIDGHIGHIDHIDIDHDHHDD

9 9 9 步操作之后,剩余的 1 1 1 张牌是 D \text{D} D,与第 5 5 5 步藏起的牌匹配。

整个魔术过程中,关键的操作有第 4 4 4 步操作、第 5 5 5 步操作、第 7 7 7 步操作、第 8 8 8 步操作和第 9 9 9 步操作,关键操作决定了待匹配的牌 D \text{D} D 的位置与剩余牌的数量。

推广到约瑟夫问题

约瑟夫问题与求解

魔术的第 9 9 9 步操作可以推广到一般形式:有 n n n 张牌围成一个圆圈,按顺时针顺序的编号依次是 1 1 1 n n n,从编号 1 1 1 的牌开始,每次向顺时针方向数 k k k 张牌并将第 k k k 张牌丢弃,直到最后只剩余 1 1 1 张牌,需要计算剩余的牌的编号。该问题为经典的约瑟夫问题。

约瑟夫问题的解法有多种。最简单的解法是模拟,时间复杂度是 O ( n k ) O(nk) O(nk),空间复杂度是 O ( n ) O(n) O(n)。更优的解法是数学解法,时间复杂度是 O ( n ) O(n) O(n),数学解法可以使用递归或迭代实现,递归实现的空间复杂度是 O ( n ) O(n) O(n),迭代实现的空间复杂度是 O ( 1 ) O(1) O(1)

f ( n , k ) f(n, k) f(n,k) 表示约瑟夫问题的解。可以使用递归的方式计算 f ( n , k ) f(n, k) f(n,k)

递归的基准情形是 n = 1 n = 1 n=1,此时圆圈中只有 1 1 1 张编号是 1 1 1 的牌,因此 f ( 1 , k ) = 1 f(1, k) = 1 f(1,k)=1

n > 1 n > 1 n>1 时,记 prevRemain = f ( n − 1 , k ) \textit{prevRemain} = f(n - 1, k) prevRemain=f(n1,k),则 prevRemain \textit{prevRemain} prevRemain n − 1 n - 1 n1 张牌中剩余的牌。如果 n n n 张牌的起始牌的编号是 1 1 1,则首张被丢弃的牌的编号是 k k k,剩余 n − 1 n - 1 n1 张牌时的起始牌的编号是 1 + k 1 + k 1+k。因此, n n n 张牌时剩余的牌的编号是 prevRemain \textit{prevRemain} prevRemain 按顺时针方向数 k k k 位。

由于牌的编号范围是 [ 1 , n ] [1, n] [1,n],因此 f ( n , k ) = ( prevRemain + k − 1 ) m o d n + 1 f(n, k) = (\textit{prevRemain} + k - 1) \bmod n + 1 f(n,k)=(prevRemain+k1)modn+1

迭代实现根据递归实现得到。用 winner \textit{winner} winner 表示剩余的牌的编号,初始时 winner = 1 \textit{winner} = 1 winner=1。对于 2 ≤ i ≤ n 2 \le i \le n 2in,从小到大遍历每个 i i i,并将 winner \textit{winner} winner 的值更新为 ( winner + k − 1 ) m o d i + 1 (\textit{winner} + k - 1) \bmod i + 1 (winner+k1)modi+1。遍历结束时, winner \textit{winner} winner 即为 n n n 张牌时剩余的牌的编号。

代码实现

下面的代码为数学解法的递归实现。

class Solution {public int findRemainCard(int n, int k) {if (n == 1) {return 1;}int prevRemain = findRemainCard(n - 1, k);return (prevRemain + k - 1) % n + 1;}
}

下面的代码为数学解法的迭代实现。

class Solution {public int findRemainCard(int n, int k) {int remain = 1;for (int i = 2; i <= n; i++) {remain = (remain + k - 1) % i + 1;}return remain;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE Spring 项目】博客系统

博客系统 前⾔项⽬介绍1. 准备⼯作1.1 数据准备1.2 创建项⽬1.3 准备前端⻚⾯1.4 配置配置⽂件1.5 测试 2. 项⽬公共模块2.1 实体类的编写2.2 公共层 3. 业务代码3.1 持久层3.2 实现博客列表3.3 实现博客详情3.4 实现登陆令牌技术JWT令牌介绍JWT令牌⽣成和校验 3.5 实现强制要求…

Netty应用(四) 之 Reactor模型 零拷贝

目录 6.Reactor模型 6.1 单线程Reactor 6.2 主从多线程Reactor (主--->Boss | 从--->Worker | 一主多从机制) 7.扩展与补充 8.Reactor模型的实现 8.1 多线程Reactor模型的实现&#xff08;一个Boss线程&#xff0c;一个Worker线程&#xff09; 8.2 多线程Reactor模…

c#进程(Process)常用方法

在C#中&#xff0c;Process类提供了一系列用于操作进程的常用方法&#xff0c;以下是其中一些常用的方法&#xff1a; Start()&#xff1a;启动一个新的进程。 Process.Start("notepad.exe");Kill()&#xff1a;终止进程。 Process.GetProcessesByName("note…

[office] 使用TRANSPOSE函数实现EXCEL表横向转纵向引用的操作方法 #知识分享#知识分享

使用TRANSPOSE函数实现EXCEL表横向转纵向引用的操作方法 一、问题的提出 我们在使用EXCEL过程中&#xff0c;有时需要将一个表中数据的“列”变为“行”&#xff0c;&#xff0c;需要将表2中引用表1的数据&#xff0c;将“列”转换为“行”&#xff0c;即大家通常所说的引用E…

SolidWorks学习笔记——入门知识1

目录 1、固定最近文档 2、根据需要自定义菜单栏 3、根据需要增添选项卡 4、命令搜索框 5、鼠标右键长按快速切换视图 6、鼠标笔势 自定义鼠标笔势 1、固定最近文档 图1 固定最近文档 2、根据需要自定义菜单栏 图2 根据需要自定义菜单栏 3、根据需要增添选项卡 图3 根据…

个人搜集的gstreamer学习链接

gstreamer资源&#xff1a; GStreamer: 官方英文官网 GStreamer C开发教程 (gstreamer安装包下载目录) GStreamer GitLab源码 gstreamer 插件列表) gstreamer官方文档&#xff1a; https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-languagec …

设计模式-建造者模式Builder

建造者模式 建造者模式 (Builder)1) 原理2) 为什么需要建造者模式3) 源码应用 建造者模式 (Builder) 1) 原理 Builder 模式&#xff0c;中文翻译为建造者模式或者构建者模式&#xff0c;也有人叫它生成器模式。 创建者模式主要包含以下四个角色&#xff1a; 1.产品&#xf…

架构(十二)动态Excel

一、引言 作者最近的平台项目需要生成excel&#xff0c;excel的导入导出是常用的功能&#xff0c;但是作者想做成动态的&#xff0c;不要固定模板&#xff0c;那就看看怎么实现。 二、后端 先捋一下原理&#xff0c;前后端的交互看起来是制定好的接口&#xff0c;其实根本上是…

面试 JavaScript 框架八股文十问十答第七期

面试 JavaScript 框架八股文十问十答第七期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;原型修改、重写 …

OCP使用CLI创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image创建route检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 通过 crc console --credentials 可以查看登录信息&…

Stable Video Diffusion图片转视频——Stability AI开源视频模型

我们前期介绍过Stable Diffusion&#xff0c;stable diffusion模型是Stability AI开源的一个text-to-image的扩散模型&#xff0c;其模型在速度与质量上面有了质的突破&#xff0c;玩家们可以在自己消费级GPU上面来运行此模型。 文生图大模型已经火了很长一段时间了&#xff0c…

Vue 前置导航

Vue 前置导航&#xff08;Vue Front Navigation&#xff09;是一种在 Vue.js 框架中实现导航功能的常见方式。它通常用于构建单页应用程序&#xff08;Single Page Application&#xff09;&#xff0c;通过在页面顶部或侧边栏显示导航菜单&#xff0c;使用户能够轻松切换到不同…

专业130+总分410+苏州大学837信号系统与数字逻辑考研经验电子信息与通信,真题,大纲,参考书

今年考研总分410&#xff0c;专业837信号系统与数字逻辑130&#xff0c;整体每门相对比较均衡&#xff0c;没有明显的短板&#xff0c;顺利上岸苏大&#xff0c;总结一下自己这大半年的复习经历&#xff0c;希望可以对大家有所帮助&#xff0c;也算是对自己考研做个总结。 专业…

Java:常用API接上篇 --黑马笔记

一、 StringBuilder类 StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a;StringBuilder比String更合适做字符串的修改操作&#xff0c;效率更高&#xff0c;代码也更…

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…

【element-ui】输入框组件el-input输入数字/输出Number类型:type=“number“、v-model.number用法

输入框组件el-input输入数字/输出Number类型 1、基础用法 输入&#xff1a;任何文本 → 输出&#xff1a;String类型 <el-input v-model"inputText"></el-input> <!-- 输入 abc —— inputText输出 "abc" 输入 123 —— inputText输出 …

JavaEE作业-实验四

目录 1.实验内容 2.实验要求 3.思路 4.程序源码 1.实验内容 简单的线上图书交易系统的服务层 2.实验要求 &#xff08;1&#xff09;使用Spring框架&#xff0c;采用XML配置 &#xff08;2&#xff09;要求具有如下服务层功能&#xff1a;商品分类、订单、购物车、库存…

11 插入排序和希尔排序

1. 插入排序 基本思想 直接插入排序是一种简单的插入排序法&#xff0c;基本思想&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 在玩扑克牌时&#xff0c;就用…

【知识整理】招人理念、组织结构、招聘

1、个人思考 几个方面&#xff1a; 新人&#xff1a;选、育、用、留 老人&#xff1a;如何甄别&#xff1f; 团队怎么演进&#xff1f; 有没有什么注意事项 怎么做招聘&#xff1f; 2、 他人考虑 重点&#xff1a; 1、从零开始&#xff0c;讲一个搭建团队的流程 2、标…

Python pandas中read_csv函数的io参数

前言 在数据分析和处理中&#xff0c;经常需要读取外部数据源&#xff0c;例如CSV文件。Python的pandas库提供了一个强大的 read_csv() 函数&#xff0c;用于读取CSV文件并将其转换成DataFrame对象&#xff0c;方便进一步分析和处理数据。在本文中&#xff0c;将深入探讨 read…