UVA 1394 And Then There Was One 约瑟夫环数学方法
题意:
n个人围成环,首先第m个人出列,然后从下一个开始,数到第k个就出列。。。问最后剩下的是谁?
为了方便,我们采用0~n-1的编号方式
先考虑当题意没有m的时候,就是说从第一个人开始,第k个人出列。
那么第一个出列的就是编号k-1的人,此时我们把剩下的人重新编号
k->0
k+1->1
k+2->2
........
k-2->n-2
假设新编号为x的人是最终剩下来的,那他在原来的编号是多少?
就是(x+k)%n
所以我们只要一直重复这个过程便能求得最开始那个人的编号,因为这个人最终的编号是0(只剩他一个人)
0->(0+k)%2->((0+k)%2+k)%3->......
回到这道题,多了个条件“首先第m个人出列”
同样的也就是编号(m-1)的人先出列,然后重新编号
m->0
m+1->1
....
m-2->n-2
所以只有递推的最后一步m变成k而已
int main() { int n,k,m; while(scanf("%d%d%d",&n,&k,&m)!=EOF&&(m||n||k)) { int x=0; for(int i=2;i<n;i++) x=(x+k)%i; x=(x+m)%n; printf("%d\n",x+1); } return 0; }