OI养老专题02:约瑟夫问题求幸存者
如题。人数为n(1<=n<=30000),共k(1<=k<=30000)组数据,所报的数m恒为2,只要求输出幸存者。
如果你还不知道什么是约瑟夫问题...——https://www.cnblogs.com/akura/p/10758080.html
如果直接暴力枚举,那么时间复杂度就为O(NM)=O(N),所有数据一共O(KNM)=O(KN)。遇上这道题就爆掉了。
那么怎么解决这种大数据的题呢?我们先手玩一把n个人的约瑟夫问题。由于每次对于n取模后的值在[0,n-1]之间,所以我们干脆让所有人的编号减1,也就是:0,1,2,......n-1。并且假设他们也从0~n-1报数。那么第一轮报数之后,出局的人就是:m%n-1。设tn=m%n,那么去掉了编号为tn-1的人之后,得到的序列就为:tn,tn+1......n-2,n-1,0,1,2......tn-2(tn-1出局了,所以没有),而他们报的数依次为0,1,2......n-1。不难发现,两个序列每个对应的元素相差为tn。
现在我们再手玩一把人数为n-1的约瑟夫问题。第一轮报数后,出局的人就是m%(n-1)-1。类似地,设tn-1=m%(n-1),剩下的序列就为:tn-1,tn-1+1......n-3,n-2,0,1,2......tn-1-2,他们报的数依次为0,1,2......n-2。两个序列每个对应的元素相差为tn-1。那么我们脑补一下递归的过程,最后我们会递归到边界:人数为1的情况。此时的幸存者就是0(编号减了1)。所以我们可以考虑通过人数少的来推出人数多的。设人数为n-1时的幸存者为ans,通过刚才的推导,不难发现当人数为n时幸存者就是(ans+m%n)%n。所以我们可以根据人数为1时幸存者为0递推上去,时间复杂度为O(N)。
由于本题有很多组数据,而我们又得出了递推公式,我们可以离线处理,用f(i)表示当人数为i时幸存者的编号,则f(i)=(f(i-1)+m)%n,每次询问时回答即可,时间复杂度为O(N+K)。或者......在线处理也是没问题的,只要加上神奇的倍增。下面再深入介绍一下倍增的做法。
不难发现,当n非常大,而m又小得可怜(比如本题)时,ans每次增加m之后对n取模还是等于ans+m,也就是说ans只增加了m。如果还是一次一次地加m的话,后面对n取模的语句始终是用不到的。所以不妨加快这个过程?设ans+m*x<n+x并且ans+m*(x+1)>=n+x+1,也就是说ans最多增加x次之后仍然小于n,即对n取模的语句无用。至于为什么n要加x,是因为往上递推了x次之后,人数也会增加x(注意我们是从人少的情况往上递推!)。分离参数之后得x<(n-ans)/(m-1),x>=(n-ans)/(m-1)-1,可得x=floor((n-ans)/(m-1))。所以我们每次累加上x*m即可,并把循环的参数i调高x。不过要注意一些细节:
1.当ans+m>n时直接上递推式子即可。
2.当i+x>=n时就累加不到x次了,只能加n-i+1次。
在线倍增的时间复杂度为O( ∑(1,n) ceil( i/ floor( i/m ) ) )≈O( ceil( n2/ floor( n2/m ) ) ),所以,复杂度接近O(M)?那么所有数据一共O(KM)。在线算法的尊严!可惜只在本题这种m=2的情况下可能跑得过离线。
OI养老专题02:约瑟夫问题求幸存者的更多相关文章
- OI养老专题03:让坏人出列的约瑟夫问题
问题是这样的:一共有2n个人,其中有n个好人,n个坏人.好人的编号是1~n,坏人的编号是n+1~2n.要求你求出最小的m(报数到m的人出局),让前n个出局的人都是坏人. 似乎除了暴力,我们想不出其它的 ...
- OI养老专题01:约瑟夫问题
有M个人,其编号分别为1-M.这M个人按顺序排成一个圈.现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后一个人 ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...
- 空间谱专题02:波束形成(Beamforming)
作者:桂. 时间:2017-08-22 10:56:45 链接:http://www.cnblogs.com/xingshansi/p/7410846.html 前言 本文主要记录常见的波束形成问题 ...
- C++程序设计基础
01 1 预编译常用的有,宏定义和包含库.2 库:是实用工具的集和,由程序员编写,可以完成一些特定的功能.3 <> 系统库 ""用户自定义库.4 宏定义:定义符号常量, ...
- 一个网站完整详细的SEO优化方案
根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...
- 瘋子C++笔记
瘋耔C++笔记 欢迎关注瘋耔新浪微博:http://weibo.com/cpjphone 参考:C++程序设计(谭浩强) 参考:http://c.biancheng.net/cpp/biancheng ...
- 大型网站seo优化之行业网站seo优化具体操作思路
第一部分:站内优化 第二部分:站外优化 第三部分:内容建设 第四部分:网站完善 一.站内优化 1.站内结构优化 2.内链策略 3.站内细节优化 4.网站地图设置 5.关键词竞争度分析 5.关键词部 ...
- OpenJudge解题经验交流
1.1编程基础之输入输出01:Hello, World! 02:输出第二个整数PS:a,b需用longint类型接收 03:对齐输出 04:输出保留3位小数的浮点数 05:输出保留12位小数的浮点数 ...
随机推荐
- rpm 安装、卸载软件命令 ——以nginx为例
1.安装 命令:rpm -ivh nginx-1.14.0-1.el7_4.ngx.x86_64.rpm 2.查看安装结果 命令:rpm -qa | grep nginx 3.升级 ...
- JavaScript(五)
循环语句 程序中进行有规律的重复性操作,需要用到循环语句. for循环 for(var i=0;i<len;i++) { ...... } while循环 var i=0; while(i< ...
- iOS 开发中字典和字符串的转换
1.字符串转字典 NSString * jsonString = @""; NSData *jsonData = [jsonString dataUsingEncoding:NSU ...
- flask之一些凌乱知识点
本篇导航: session组件 上下文与内置函数 pymysql问题 模版问题 一.session组件 1.session组件简介 flask-session是flask框架的session组件,由于 ...
- ECMA Script 6_RegExp 正则表达式
在 ES5 中 RegExp 构造函数的参数有两种情况 RegExp(字符串, 正则表达式的修饰符) RegExp(正则表达式); var regex = new RegExp('xyz', 'i') ...
- P2678 跳石头---(二分答案)
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NNN 块岩石 ...
- react路由
针对多个列表导航公用一个组建,然后 有两种路由方式 1.import {HashRouter as Router,Route,Link} from 'react-router-dom' 不过这个路由中 ...
- 一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相
在我们 2015 年开始的从 .NET Framework 向 .NET Core 迁移的工程中,遇到的最大的坑就是标题中所说的--同步方法中调用异步方法发生"死锁".虽然在 .N ...
- Linux技术栈整理一:系统体系结构
Linux操作系统必备的硬件构造: CPU 主板 显卡 硬盘 网卡 外设(键鼠-输入设备 / 显示器-输出设备) 内核管理调度: 内核体系结构: 来源于:极客专栏
- linux03:系统常用的命令
1,蜗牛,硬件-内核-接口API(系统调用接口)-程序或者服务,用户不能直接和硬件对话,所以需要一个翻译器,这个翻译器就是shell.美国盾牌 2,shell是一个翻译官,bash是所有翻译官里面干的 ...