目录

1. 问题描述

2. 解题分析

2.1 思路1

2.2 思路2

3. 代码及测试

4. 后记


1. 问题描述

问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得经过2(n-1)次洗牌后,恢复最初顺序?分两种情况考虑:

Case1: 2(n-1)次洗牌后,牌恢复最初顺序

Case2: 2(n-1)次洗牌后第一次恢复顺序

Case2可以看作是case1的一种特殊情况。Case1的意思是,如果在m{其中m为2(n-1)的因子}次洗牌后回复最初顺序即可。

2. 解题分析

2.1 思路1

第一感是以下这个‘高大上’的想法:

呃。。。虽说如此,群论只学了一丢丢。。。等我先把群论学一学再来看这条路能不能走通。本系列其实出现过好几道可以用群论来解决的问题。群论学习从开始到放弃经历过好多次了,这次带着问题去学习看看能不能走得远一些。

2.2 思路2

(没有别的更炫的法子时)蛮干就是了。。。

针对每一个n,从初始状态(初始状态是什么并不重要)开始,以迭代的方式进行以上permutation操作,并判断是否回到了最初状态。

算法流程如下:

3. 代码及测试

# -*- coding: utf-8 -*-
"""
Created on Sat Oct  9 19:33:11 2021@author: chenxy
"""# import sys
import time
# import datetime
# import math
# import random
# from   typing import List
# from   queue import Queue
# from   collections import deque
# import itertools as it
import numpy as npN = 100ok_list = []tStart = time.perf_counter()
for n in range(1,N+1):start = np.arange(2*n)p     = np.zeros_like(start)for k in range(n):p[2*k]   = start[k]p[2*k+1] = start[n+k]# print(p)cur = startcnt = 0# recover = Falsewhile 1:cur = cur[p]cnt = cnt + 1if np.array_equal(cur, start):# print(n, cur, start, cnt)if (2*(n-1) % cnt) == 0:# if (2*(n-1)) == cnt:# print(n, cur, start, cnt)# recover = Trueok_list.append(n)breakif cnt > 2*(n-1):break# if recover:# ok_list.append(n)
tCost  = time.perf_counter() - tStartprint('length of ok_list = {0}, tCost = {1:6.3f}(sec)'.format(len(ok_list),tCost))
print(ok_list)        

case1运行结果:

length of ok_list = 46, tCost =  0.046(sec)
[1, 2, 3, 4, 6, 7, 9, 10, 12, 15, 16, 19, 21, 22, 24, 27, 30, 31, 34, 36, 37, 40, 42, 45, 49, 51, 52, 54, 55, 57, 64, 66, 69, 70, 75, 76, 79, 82, 84, 87, 90, 91, 96, 97, 99, 100]

case2运行结果(注释掉 "if (2*(n-1) % cnt) == 0:",打开 “ if (2*(n-1)) == cnt:)":

length of ok_list = 45, tCost =  0.059(sec)
[2, 3, 4, 6, 7, 9, 10, 12, 15, 16, 19, 21, 22, 24, 27, 30, 31, 34, 36, 37, 40, 42, 45, 49, 51, 52, 54, 55, 57, 64, 66, 69, 70, 75, 76, 79, 82, 84, 87, 90, 91, 96, 97, 99, 100]

尴尬。。。case2的结果与原书的结果不符。想不出哪里不对,哪个小伙伴看出来毛病来了请不吝指教^-^

4. 后记

两个遗留事项:

(1) 基于群论的解决方法

(2) case2的结果不对

嗯,我一定会回来的。。。

上一篇:程序员的算法趣题Q49: 欲速则不达

下一篇:程序员的算法趣题Q51: 同时结束的沙漏

本系列总目录参见:程序员的算法趣题:详细分析和Python全解

程序员的算法趣题Q50: 完美洗牌相关推荐

  1. php算法求出一个数可以被分解成多少个_程序员的算法趣题

    计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...

  2. 程序员的算法趣题Q25: 时髦的鞋带系法

    目录 1. 问题描述 2. 解题分析 2.1 状态表示方法 2.2 DFS 2.3 遍历下一个状态 2.4 交叉判断 3. 代码 4. 后记 1. 问题描述 即便系得很紧,鞋带有时候还是免不了会松掉. ...

  3. 程序员的算法趣题 python3 - (5)

    注:以下题目来自<程序员的算法趣题>– [日]增井敏克著,原书解法主要用Ruby实现,最近在学Python,随便找点东西写写当做练习,准备改成Python3实现,顺便增加一些自己的理解. ...

  4. LeetBook《程序员的算法趣题》Q18---水果酥饼日

    <程序员的算法趣题>-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言. Q18 水果酥饼日   日本每月的 22 日是水果酥 ...

  5. 程序员的算法趣题Q09: 落单的男女

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...

  6. 程序员的算法趣题Q55: 平分蛋糕

    目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...

  7. 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?

    目录 1. 问题描述 2. 解题分析 2.1 基本思路 2.2 动态规划 2.3 算法流程 3. 代码及测试 4. 后记 1. 问题描述 注意,本问题不区分人,只考虑各个座位被占用的不同顺序的个数. ...

  8. 程序员的算法趣题Q68: 异性相邻的座位安排(1)

    目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 后记 1. 问题描述 这道题的描述应该是有问题的(不知道是原文的问题还是翻译的问题). 前面的描述中提到"前后左右的座位全是异性 ...

  9. 程序员的算法趣题Q57: 最快的联络网

    目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...

最新文章

  1. 设计中最常用的CSS选择器
  2. eeglab教程系列(15)-绘制独立成分ERP贡献
  3. 沫沫金:联想E431 1K6安装Windows系统100%成功技巧
  4. ubuntu下各个目录的含义
  5. java 获取web目录结构_Intellij Idea Javaweb 目录结构及获取项目内资源
  6. sharedpreferences使用方法_Google 推荐在 MVVM 架构中使用 Kotlin Flow
  7. Android 刘海屏来袭,全网最全适配技巧
  8. Jolt大奖获奖图书
  9. java框架_2020年到了,你需要掌握的9大顶级Java框架
  10. 欧姆龙PLC程序 本程序包括有欧姆龙CP1H脉冲程序案例,威纶通触摸屏程序
  11. linux c Make file 的生成
  12. 2021 Mac系统升级后,按大小写键没反应了,切换大小写的灯不亮了
  13. vs项目中的筛选器(filter)
  14. Python+Opencv识别视频统计人数
  15. 安装batocera-linux教程_新的BATOCERA(巴托塞拉)安装方式和Windows共用硬盘双启动
  16. 淘宝/天猫API:item_search_coupon-优惠券查询
  17. 抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。
  18. HDFS 系列二:HFDS 命令行操作
  19. linux服务器 cpu使用率过高,服务器CPU使用率过高排查与解决思路
  20. 如何用js完美的解析lrc歌词

热门文章

  1. SOLIDWORKS Electrical无缝集成电气和机械设计
  2. 金山毒霸把我的oracle监听服务,金山毒霸误杀我的i_eyes.exe
  3. 漏洞利用(CVE-2017-5638)
  4. modelsim 无objects窗口 的解决方法
  5. 智能窗帘电机究竟有何亮点?智汀小米有何优势?
  6. 前端单位px,pt,rem,逻辑像素,物理像素
  7. Pytorch里addmm()和addmm_()的用法详解
  8. 北京月薪高于1.7万的开发者占比远超其它地区;和黄医药获霸菱亚洲1亿美元股权投资 | 美通企业日报...
  9. 美团CAT客户端集成
  10. krpano plugin interface