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
",x+1);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/BMan/p/3249094.html