zoukankan      html  css  js  c++  java
  • 51nod1073-约瑟夫环,递归。

    N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
    例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
    Input
    2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)
    Output
    最后剩下的人的编号
    -----------------------------------------------------------------------------------------------------------------------------------------------------
    N个人,编号(0-N-1)。
    第一个出去的肯定是编号为(K%N)-1。第二轮从K%N开始新的编号:

    接下来就变成N-1个人的子问题了。
    令F(N)代表N个人时最后剩下的人的编号。那么F(N) = G(F(N-1));
    函数G就是编号的对应,可以看出,G(i) = (i+K%N)%N = (i+K)%N。也就是向前平移了K个位置。
     
    递归的出口是F(1)=0;因为1个人时结果就是编号为0的人。
     
    下面代码是递归的,用递推的会省空间。
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int K;
    int phi(int n){
        if(n==1) return 0;
        return (phi(n-1)+K)%n;
    }
    int main(){
        int n;
        cin>>n>>K;
        printf("%d
    ",phi(n)+1);
        return 0;
    }
  • 相关阅读:
    Simulink模块之Zero-Order Hold和Unit Delay的区别
    芯片电源引脚的去耦电容
    STM32中电源引脚
    Simulink:模块参数初始化
    工作笔记1
    至少清楚知道兼容IE8 ie9 ;持续更新
    FROM_UNIXTIME/CONCAT
    采集文章
    文件上传类(引用)
    php文件相关操作
  • 原文地址:https://www.cnblogs.com/redips-l/p/7994922.html
Copyright © 2011-2022 走看看