zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    linux -- 部署java服务器(3) linux安装redis
    linux 安装php8
    linux mysql查看日志
    linux mysql常用的命令
    perl heredoc
    perl数值进制
    提问的智慧
    How to ask question the smart way
    PERL命令行
    图灵/异步图书
  • 原文地址:https://www.cnblogs.com/BMan/p/3249094.html
Copyright © 2011-2022 走看看