Gahing's blog Gahing's blog
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Gahing / francecil

To be best
首页
知识体系
  • 前端基础
  • 应用框架
  • 工程能力
  • 应用基础
  • 专业领域
  • 业务场景
  • 前端晋升 (opens new window)
  • Git
  • 网络基础
  • 算法
  • 数据结构
  • 编程范式
  • 编解码
  • Linux
  • AIGC
  • 其他领域

    • 客户端
    • 服务端
    • 产品设计
软素质
  • 面试经验
  • 人生总结
  • 个人简历
  • 知识卡片
  • 灵感记录
  • 实用技巧
  • 知识科普
  • 友情链接
  • 美食推荐 (opens new window)
  • 收藏夹

    • 优质前端信息源 (opens new window)
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • AIGC

  • Git

  • Linux

  • 数据协议

  • 数据结构

  • 架构设计

  • 算法

    • 二分查找

    • 动态规划

    • 字符串匹配

    • 排序算法

    • 约瑟夫环
    • 编程工具

    • 编程范式

    • 编解码

    • 网络基础

    • 通用技术
    • 算法
    gahing
    2018-02-01
    目录

    约瑟夫环

    # 共m个人(编号0~m-1) 第k个报数离开

    上一轮 n+1 个人

    该轮(n人)编号为0的在上一轮编号为 (k)%(n+1) (数到0~k-1,下一个就是k)

    即:编号为f(n)的在上一轮编号f(n+1) 为 (f(n)+k)%(n+1)

    求f(1)=0 时 其f(m)的值

    f[1]=0;
    
    for(int i=2;i<=m;i++){
      f[i]=(f[i-1]+k)%i;
    }
    
    
    1
    2
    3
    4
    5
    6

    # 变种1:编号1~m

    f[1]=1;
    
    for(int i=2;i<=m;i++){
      f[i]=(f[i-1]+k)%i;
      if(f[i]===0)f[i]=i;
    }
    result=f(m)
    
    1
    2
    3
    4
    5
    6
    7

    # 变种2:编号1~m,从第j个开始报数

    还是和变种1一样,先算出正常报数时的最后一个人的原始编号,result=(f(m)+j-1)%m

    f[1]=1;
    
    for(int i=2;i<=m;i++){
      f[i]=(f[i-1]+k)%i;
      if(f[i]===0)f[i]=i;
    }
    result=(f(m)+j-1)%m
    if(result===0)result=m
    
    1
    2
    3
    4
    5
    6
    7
    8

    # 变种3:编号为1~m,已知留到最后的原始编号为t,求从第j个开始报数可实现

    先算出从1开始报数时最后一个人的原始编号f(m),

    res=(t-(f(m)-1))%m res==0?m:res

    f[1]=1;
    
    for(int i=2;i<=m;i++){
      f[i]=(f[i-1]+k)%i;
      if(f[i]===0)f[i]=i;
    }
    res=(t-(f(m)-1))%m 
    res==0?m:res
    
    1
    2
    3
    4
    5
    6
    7
    8

    # 变种4:编号为0~m-1,留到最后三个人的原始编号

    f(1) = 0
    f(2) = k%2
    g(2) = (f(2)+1)%2
    f(3) = (f(2)+k%3
    g(3) = (g(2)+k)%3
    h(3) = {0,1,2}-{f(3),g(3)}
    for(int i = 4;i<=m;i++){
      
    }
    
    最后算出f(m),g(m),h(m)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    编辑 (opens new window)
    上次更新: 2024/09/01, 23:56:56
    快速排序
    glob 模式匹配笔记

    ← 快速排序 glob 模式匹配笔记→

    最近更新
    01
    浅谈代码质量与量化指标
    08-27
    02
    快速理解 JS 装饰器
    08-26
    03
    Vue 项目中的 data-v-xxx 是怎么生成的
    09-19
    更多文章>
    Theme by Vdoing | Copyright © 2016-2024 Gahing | 闽ICP备19024221号-1
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式