P1168 - 罗马轮盘
题目描述
历史学家弗拉维乌斯·约瑟夫斯记载了公元 67 年罗马-犹太冲突中,罗马人攻占了他所指挥的约塔帕塔城。约瑟夫斯逃脱后发现自己与 40 名同伴被困在一个洞穴中。罗马人发现了他们的位置并邀请他投降,但他的同伴们拒绝让他投降。因此,他建议他们通过抽签的方式一个接一个地互相杀死。传统说法是,抽签的方法是站成一个圆圈,从某一点开始数,每数到第三个人就将其杀死。这个过程的唯一幸存者是约瑟夫斯,他随后向罗马人投降。这就引出了一个问题:约瑟夫斯之前是否曾在黑暗角落里悄悄用 41 颗石子练习过,或者他是否通过数学计算得出自己应该站在第 31 个位置才能生存?
在阅读了这起骇人听闻的事件的描述后,你开始担心自己将来某个时候会遇到类似的情况。为了为这种可能性做好准备,你决定编写一个程序,在你的掌上电脑上运行,以确定计数过程应从哪个位置开始,以确保你将是唯一的幸存者。
特别地,你的程序应能够处理约瑟夫问题描述的以下变体。n > 0 个人最初围成一圈,面向内侧,并从 1 到 n 编号。编号从 1 到 n 按顺时针方向连续进行。你分配的编号是 1。从编号为 i 的人开始,按顺时针方向计数,直到数到编号为 k(k > 0)的人,该人立即被处死。然后我们从被害者左侧紧邻的人开始,继续顺时针方向再数 k 个人。被选中的编号为 k 的人负责埋葬被害者,然后返回被害者之前所在的位置。计数随后从他左侧的紧邻的人开始,第 k 个人被处死,依此类推,直到只剩下一人。
例如,当 n = 5,k = 2,i = 1 时,处决顺序是 2、5、3 和 1。幸存者是 4。
输入格式
你的程序必须读取包含 n 和 k 值的输入行(按此顺序)。输入以一行 n 和 k 均为$0$的值结束。
你的程序可以假设最多有 100 人参加此活动。
输出格式
对于每一行输入,输出应从哪一个人的编号开始计数,以确保你是唯一的幸存者。例如,在上述情况下,安全的起始位置是 3。
输入输出样例 #1
输入 #1
5 2
1 5
0 0
输出 #1
3
1
测试点数目
共10个测试点,每个测试点10分
时间与内存限制
每个测试点时间:1000ms(1.0s),内存:256MiB
输入输出模式
本OJ支持两种输入输出模式