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位小数的浮点数 ...
随机推荐
- python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件
Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...
- ionic2中使用极光IM的WebSDK实现即时聊天
本文主要介绍如何在ionic项目中集成极光IM的WebSDK,详细文档可参考官方介绍. 一.准备 1. 注册激光账号,进入开发者服务页面创建应用. 2. 创建应用后须完成对应平台的推送设置,进行应用或 ...
- 咸鱼入门到放弃6--jsp<一>三指令
JSP全称是Java Server Pages 它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比htm ...
- Windows Server 2008 R2 修改远程桌面服务RDP默认端口及相应的防火墙配置
修改以下两个注册表项当中的默认端口3389为自定义端口: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wd ...
- ASP.NET Core 3.0预览版体验
目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3,对应ASP.NET Core 3.0 Preview 3. ASP.NET Core 3.0 之后将不再支持.NE ...
- Tips_一级菜单栏实现
1.纵向 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- [LeetCode] Split BST 分割二叉搜索树
Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...
- js如何判断数字是否有小数
//如果是5.00之类的,转换后,应该不要小数点后的位数 let num = 5.34; //let num = 5.00; let arr = num .toString().split(" ...
- Collections类
1:一个类对象之间的比较两种方法 1)实现Comparator<String>类并且从写Comparator类中的compare方法, public class A implements ...
- [dev][ipsec][dpdk] strongswan/dpdk源码分析之ipsec算法配置过程
1 简述 storngswan的配置里用一种固定格式的字符串设置了用于协商的预定义算法.在包协商过程中strongswan将字符串转换为固定的枚举值封在数据包里用于传输. 协商成功之后,这组被协商选中 ...