题干:

N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。

例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。

Input

2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)

Output

最后剩下的人的编号

Input示例

3 2

Output示例

3

解题报告:

思路: 直接模拟的话O(n*k)的时间复杂度,按照套路来的话这样的题一般是能找规律的;
我们先将n个人的编号改成0~n-1(别问为什么,套路而已),那么第1次报到号码为k-1的人出列,圈里还剩下n-1个人
我们对比一下出列前后的编号:出列前:  0, 1, 2, 3, 4, 5, 6, ...k-2, k-1, k... n-1
出列后:  n-k+1,..................n-2,    , 1... n-k我们可以发现留下的人编号和留下来之前是一一对应的,那么要是能找到对应关系的话问题就迎刃而解了,不过现在数据太多了不好找
(偶就是这里找错了规律然后只过了样例),我们接着往下想想...
按照前面的规律,第n次报数时只有一个人,我们给他重新编号为0.前面我们也知道了某一轮某个人的编号和上一轮是对应的,最后留下的人此时的编号为0,
那么只要我们由它上溯并找到它在第一轮时的编号答案就出来了啦~
我们用f(x)表示最后留下来那个人在第n-x+1轮中的编号(这样做我们就是由f(1)推f(n),更直观一些,反之由f(n)推f(1)也是可以的),那么f(n)+1就是
最终答案了啦.很显然有f(1)=0(因为此时只剩下一个人了嘛),接下来我们需要找到两轮编号之间的映射关系,这个可以有枚举k和x得到,这里就不写枚举
过程了啦~
最后我们可以得到公式 f(x)=(f(x-1)+k)%x;

AC代码:

#include <bits/stdc++.h>
using namespace std;int main(void){int gg, n, k;cin >> n >> k;gg=0;for(int i=2; i<=n; i++){gg=(gg+k)%i; //前面说的f(x)只是为了我们更直观地理解,其实直接用一个变量保存上一轮序号就可以了}cout << gg+1 << endl;return 0;
}

转自https://www.cnblogs.com/geloutingyu/p/6202200.html

【51nod - 1073】约瑟夫环问题模板相关推荐

  1. 约瑟夫环(51nod)

    先理解下什么是约瑟夫问题:https://blog.csdn.net/tingyun_say/article/details/52343897 以及解决方法:https://blog.csdn.net ...

  2. K - Let the Flames Begin Gym - 101955K(约瑟夫环/2018icpc沈阳)

    VJ地址 思路:因为m和k的最小值一定小于2E6,那么我们可以分情况来求,如果m比较小直接o(m) 递推求出第m个死的人,如果k比较小,我们在每一轮+k的时候取模的操作都是无效的,我们可以用乘法累积起 ...

  3. POJ 3517 And Then There Was One( 约瑟夫环模板 )

    链接:传送门 题意:典型约瑟夫环问题 约瑟夫环模板题:n个人( 编号 1-n )在一个圆上,先去掉第m个人,然后从m+1开始报1,报到k的人退出,剩下的人继续从1开始报数,求最后剩的人编号 /**** ...

  4. 代码验证约瑟夫环百科词条中的故事(Python)——约瑟夫斯的故事、数学家加帕斯讲的故事,体验算法模板的奇妙。

    [点击此处跳转笔记正文] Python 官网:https://www.python.org/ Free:大咖免费"圣经"教程< python 完全自学教程>,不仅仅是基 ...

  5. 51nod 1073 约瑟夫环

    N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...

  6. C++约瑟夫环改良版

    约瑟夫环:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的 ...

  7. HDU 5643 King's Game 【约瑟夫环】

    题意: 变形的约瑟夫环,最初为每个人编号1到n,第i次删去报号为i的人,然后从它的下一个人开始重新从1开始报号,问最终剩下第几号人? 分析: 首先看一下裸的约瑟夫环问题: 共n个人,从1开始报数,报到 ...

  8. 约瑟夫环问题的几种解法

    int mind01() {vector<int> vec;int n, m;scanf("%d%d",&n,&m);//初始化for (int i=1 ...

  9. python中约瑟夫环程序_Python实现约瑟夫环问题的方法

    本文实例讲述了Python实现约瑟夫环问题的方法.分享给大家供大家参考,具体如下: 题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的 ...

最新文章

  1. 设计模式之工厂模式(Factory)(3)
  2. CCF-百度松果基金闭门研讨会成功举办,百度飞桨提供基金平台支持
  3. Java基础之线程池
  4. 微软银光 Sliverlight
  5. 创业12年 最野蛮的屌丝创业者
  6. GD32F303修改外部25M晶振
  7. unity视频教程【高清+精选】大放送
  8. WORD VBA实现查找带格式的文字并复制到特定地方
  9. a股用计算机模拟走势,告诉你A股今后几天惊现千股涨停
  10. 工业镜头景深计算及工业镜头技术分析
  11. 淫欲的真相是什么呢?可能很多英雄豪杰都没有想到过
  12. Apollo安装记录
  13. 【看表情包学Linux】缓冲区的概念 | Git 三板斧 | 实现简易进度条
  14. Spirng的事务 方法A调用方法B,事务是否失效
  15. DBeaver 工具的使用
  16. 来自Percal25号行星的哥顿人
  17. 眨个眼就学会了 Pixi.js
  18. 应用 AddressSanitizer 发现程序内存错误
  19. 【咸鱼】有关origin下载速度过慢解决措施
  20. 【UE4】C++的RPC调用

热门文章

  1. Java学习笔记3——集合框架
  2. shell变量里的字符替换
  3. centos 源码安装mysql5.6_CentOS 7下源码安装MySQL 5.6
  4. git连接jenkins_开普勒云平台:如何配置gitlab与Jenkins
  5. java jlabel里面加button_在Java Swing中通过JLabel覆盖JButton?
  6. 987C. Three displays
  7. db2 某个字段排序_MySQL、Oracle、DB2等数据库常规排序、自定义排序和按中文拼音字母排序...
  8. GenerateProjectFiles.bat分析
  9. php怎么调试小程序,教你如何配置微信小程序
  10. java vo转map_JAVA Map转换为Bean或VO