如题。人数为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:约瑟夫问题求幸存者的更多相关文章

  1. OI养老专题03:让坏人出列的约瑟夫问题

    问题是这样的:一共有2n个人,其中有n个好人,n个坏人.好人的编号是1~n,坏人的编号是n+1~2n.要求你求出最小的m(报数到m的人出局),让前n个出局的人都是坏人. 似乎除了暴力,我们想不出其它的 ...

  2. OI养老专题01:约瑟夫问题

    有M个人,其编号分别为1-M.这M个人按顺序排成一个圈.现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后一个人 ...

  3. 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)

    To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...

  4. 空间谱专题02:波束形成(Beamforming)

    作者:桂. 时间:2017-08-22  10:56:45 链接:http://www.cnblogs.com/xingshansi/p/7410846.html 前言 本文主要记录常见的波束形成问题 ...

  5. C++程序设计基础

    01 1 预编译常用的有,宏定义和包含库.2 库:是实用工具的集和,由程序员编写,可以完成一些特定的功能.3 <> 系统库 ""用户自定义库.4 宏定义:定义符号常量, ...

  6. 一个网站完整详细的SEO优化方案

    根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...

  7. 瘋子C++笔记

    瘋耔C++笔记 欢迎关注瘋耔新浪微博:http://weibo.com/cpjphone 参考:C++程序设计(谭浩强) 参考:http://c.biancheng.net/cpp/biancheng ...

  8. 大型网站seo优化之行业网站seo优化具体操作思路

      第一部分:站内优化 第二部分:站外优化 第三部分:内容建设 第四部分:网站完善 一.站内优化 1.站内结构优化 2.内链策略 3.站内细节优化 4.网站地图设置 5.关键词竞争度分析 5.关键词部 ...

  9. OpenJudge解题经验交流

    1.1编程基础之输入输出01:Hello, World! 02:输出第二个整数PS:a,b需用longint类型接收 03:对齐输出 04:输出保留3位小数的浮点数 05:输出保留12位小数的浮点数 ...

随机推荐

  1. Ubuntu系统查看显卡型号和NVIDIA驱动版本

    查看GPU型号 lspci | grep -i nvidia 查看NVIDIA驱动版本 sudo dpkg --list | grep nvidia-*

  2. 通过linux版本的lr agent提示找不到web_reg_save_param_ex函数

    Action.c(5): Error: C interpreter run time error: /tmp/brr_TSBgR2/netdir/E/lrscript/aaa/Action.c (5) ...

  3. sql防止注入

    使用PreparedStatement的参数化的查询可以阻止大部分的SQL注入.在使用参数化查询的情况下,数据库系统不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才 ...

  4. poj1106-Post Office(DP)

    Description There is a straight highway with villages alongside the highway. The highway is represen ...

  5. Problem B. Beer Refrigerator

    http://codeforces.com/gym/241680/problem/B比赛的时候考虑的是,它们3个尽可能接近,然后好麻烦,不如暴力枚举,这里不需要质因数分解,而是两重循环枚举所有因数,第 ...

  6. HttpSession与JSESSIONID的"盗用"

    https://blog.csdn.net/qq1437715969/article/details/75331652

  7. coolSQL安装与使用

    由于笔者最近支援其他项目,所使用的数据库为informix 所以安装一个coolSQL客户端方便些,当然命令行方式也可以,但是感觉不太友好,下面把安装与简单使用过程分享给大家. 一.下载coolSQL ...

  8. 09-Http & Servlet

    Http协议&Servlet Http协议 什么是协议 > 双方在交互.通讯的时候, 遵守的一种规范.规则. http协议 > 针对网络上的客户端 与 服务器端在执行http请求的 ...

  9. js之promise讲解

    1 Promise概述 Promise对象是CommonJS工作组提出的一种规范,目的是为异步操作提供统一接口. 那么,什么是Promises? 首先,它是一个对象,也就是说与其他JavaScript ...

  10. jmeter--001.介绍、下载与安装

    一.介绍 使用场景: -1.接口测试 -2.性能测试 .... 特点: -1.开源.轻量级.插件化 -2.适合自动化和持续集成 二.下载(Windows环境) 下载网址:http://jmeter.a ...