2016.10.14
【题目描述】
1033.约瑟夫问题(Joseph)
时限:100ms 内存限制:10000K 总时限:1000ms
描述
设有N名同学手拉手围成一圈,自1、2、3、……开始编号,现从1号开始连续数数,每数到M将此同学从圈中拉走, 求最后被拉走的同学的编号
输入
两个正整数M和N
输出
一个正整数,为最后被拉走的同学的编号,最后输出回车
输入样例
5 3
输出样例
4
【解题思路】
这就是传说中的约瑟夫环问题。
从1开始报数,报到m的人会出列,这时第m+1个人编号为1,剩下的n-1个人又组成了一个新的约瑟夫环。如果我们知道了子问题的解,那么就能知道原问题的解。易知剩下最后一个人的编号为1,可以向前推出原问题的解。
考虑原数列: 1,2,…,n
第m-1个人出列:1,2,…,k-1,k+1,…,n (k = m % n)
改变顺序: k+1,k+2,…,n-1
重新编号: 1,2,…., n-1
这样设子问题的解为x’, 易知x’ = x + k = x + m % n = (x + m) % n;
【代码实现】
#include <iostream>
usin