• 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
  • 相关阅读:
    桥接模式(Bridge)
    Python中文件操作
    Python中字符的编码与解码
    反转部分单向链表
    删除链表的中间节点和a/b处的节点
    链表中删除倒数第K个节点
    如何实现链表的逆序
    Python高阶函数及函数柯里化
    Python函数作用域
    Python函数参数与参数解构
  • 原文地址:https://www.cnblogs.com/BMan/p/3249094.html
Copyright © 2020-2023  润新知