题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3089

题目大意:一共n人。从1号开始,每k个人T掉。问最后的人。n超大。

解题思路

除去超大的n之外。就是个约瑟夫环的裸题。

约瑟夫环递推公式,n为人数,k为步长。

f(1)=0

f(n)=[f(n-1)+k]%i  i∈[2,n]

f(n)还要经过起始位置修正,设起始位置为s,即ans=[f(n)+s]%n。

基本约瑟夫环优化就是当k=1的时候,每次递推就是在+1,可以直接算出来快速跳过,f(n)=f(1)+n-1

当n超大的时候,可以照着这种思路快速简化递推过程。在递推后期,f(x)+k在很长的周期内<i,假设有m个周期,

那么这些周期合并后的结果相当于f(x)+m*k。可以快速跳过。条件限制是: f(x)+m*k<i+(m-1)

可以推出来:

当m=1时,条件限制: f(x)+k<i

当m=2是,条件限制: f(x+1)+k<i+1=f(x)+2*k<i+1

当m=m时,条件限制:f(x)+m*k<i+(m-1)

化简有m<(i-f(x)-1)/(k-1),若能整除,就是(i-f(x)-1)/(k-1)-1,否则就是(i-f(x)-1)/(k-1)直接取整。

这样,i+=m,f(x)+=m*k,快速跳过了中间过程。

若i+m>n,说明快速跳越界了,这时候可以直接算出f(n)=f(x)+(n-i-1)*m。

#include "cstdio"
#define LL long long
LL solve(LL n,LL k,LL s=)
{
if(k==) return (n-+s)%n;
LL ans=;
//ans=(ans+k)%i
for(LL i=;i<=n;)
{
if(ans+k<i) //快速跳跃
{
LL leap;
if((i-ans-)%(k-)==) leap=(i-ans-)/(k-)-;
else leap=(i-ans-)/(k-);
if(i+leap>n) return ((ans+(n+-i)*k)+s)%n;
i+=leap;
ans+=leap*k;
}
else
{
ans=(ans+k)%i;
i++;
}
}
return (ans+s)%n;
}
int main()
{
//freopen("in.txt","r",stdin);
LL n,k;
while(scanf("%I64d%I64d",&n,&k)!=EOF)
{
LL ans=solve(n,k);
if(ans==) printf("%I64d\n",n);
else printf("%I64d\n",ans);
}
}

HDU 3089 (快速约瑟夫环)的更多相关文章

  1. hdu 3089 (快速约瑟夫环)

    Josephus again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. poj 1012 &amp; hdu 1443 Joseph(约瑟夫环变形)

    题目链接: POJ  1012: id=1012">http://poj.org/problem?id=1012 HDU 1443: pid=1443">http:// ...

  3. hdu 4841 圆桌问题(用vector模拟约瑟夫环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4841 圆桌问题 Time Limit: 3000/1000 MS (Java/Others)    M ...

  4. hdu 1443 Joseph【约瑟夫环】

    题目 题意:一共有2k个人,分别为k个好人和k个坏人,现在我们需要每隔m个人把坏人挑出来,但是条件是最后一个坏人挑出来前不能有好人被挑出来..问最小的m是多少 约瑟夫环问题,通常解决这类问题时我们把编 ...

  5. HDU 5643 King's Game | 约瑟夫环变形

    经典约瑟夫环 }; ; i<=n; i++) { f[i] = (f[i-] + k) % i; } 变形:k是变化的 #include <iostream> #include &l ...

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

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

  7. javascript中使用循环链表实现约瑟夫环问题

    1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...

  8. Roman Roulette(约瑟夫环模拟)

    Roman Roulette Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  9. King's Game---hdu5643(约瑟夫环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5643    约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从 ...

随机推荐

  1. NYOJ题目1080年龄排序

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtMAAAJVCAIAAACTf+6jAAAgAElEQVR4nO3dO1Lj3NbG8W8Szj0QYg ...

  2. mysqli的增强功能

    批量执行sql语句 批量执行dml语句 基本语法 $sqls="sql1.sql2.sql3...." mysqli::multi_query($sqls) 案例: $mysqli ...

  3. windows重新获取IP

    win+r------->cmd------>ipconfig /release (释放ip) ipconfig /renew  重新获取ip

  4. centos vsftp 服务器配置

    安装服务端: # yum install -y vsftpd 安装客服端: # yum install ftp -y http://os.51cto.com/art/201408/448630.htm

  5. 在ubuntu上搭建开发环境4---ubuntu简单的搭建LAMP环境和配置

    最近重新安装了Ubuntu,但是之前的LAMP环境自然也就没有了,实在是不想再去编译搭建LAMP环境(这种方法实在是太费时间,而且太容易遇到各种不知道为什么的错误),所以,就去查查有没有什么简单的搭建 ...

  6. js 横幅播放

    js 横幅播放 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  7. android 入门-使用adb安装及卸载apk

     我想用adb 安装apk 到设备上现在出现了2个. 提示我没有找到设备    安装不用进去adb shell 这是你存放apk文件夹路径 下面安装apk到手机上(usb一定要连接成功否则读取不到手机 ...

  8. hibernate base

    第一个类:Person.java package org.crazyit.app.domain; import java.io.Serializable;import java.util.ArrayL ...

  9. ListView遍历每个Item出现NullPointerException的异常(转)

    在使用ListView过程中我们有时候需要遍历取得每个Item项中的一些数据(比如每个Item里面有TextView,需要获取它的文本等等),但是我们在遍历过程中经常会遇到NullPointerExc ...

  10. AngularJS - 指令入门

    指令,我将其理解为AngularJS操作HTML element的一种途径. 由于学习AngularJS的第一步就是写内置指令ng-app以指出该节点是应用的根节点,所以指令早已不陌生. 这篇日志简单 ...