shuoj-Josephus问题-dp数学

来源:互联网 发布:python适合做什么开发 编辑:程序博客网 时间:2024/05/05 06:12

Description

1 N编号的个人按顺时针方向围坐一圈,每人持有一个密码(正整数)做游戏。游戏开始时,以正整数m作为报数上限值,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将其密码作为新的报数上限值,从其下一个人开始重新报数,如此下去,直至所有的人全部出列为止。如N=7m=20,每个人的密码依次是:3172484,则出列顺序为6147235要求最后一个出列的人的编号。

Input

有多组测试数据。每组有两行,第1行有2个正整数nm,(nm<100),n表示人数,m表示开始时报数上限值,第2行有n个整数,一次表示第12,个人的密码

Output

对每组测试数据,输出最后一个人的编号。

Sample Input

7 203 1 7 2 4 8 4

Sample Output

5

题解::
本题直接模拟很简单,但是只是模拟还是不够的。
我们还可以通过数学归纳的思想进行推导。


数学推导:
前提:编号从0开始。
首先 n = 1 时 ,最后的编号 r 为0

然后假设当n = k-1 时假设最后的编号为r

则当n = k 时,
首先淘汰的是第((m-1)%k)个人,然后我们以(m%k)为基准,剩下k个人(最后剩下的为以(m%k)为基准的编号r)既最终剩下的人为(m+r)%k

所以我们得到
r = 0
r = (m+r)%k k:1->n


1 0
原创粉丝点击