• 51nod 1074 约瑟夫环 V2


    N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
    例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
     
    Input
    2个数N和K,表示N个人,数到K出列。(2 <= N <= 10^18, 2 <= K <= 1000)
    Output
    最后剩下的人的编号
    Input示例
    3 2
    Output示例
    3
    —————————————————————————————————
    这道题 首先约瑟夫环满足 f[n]=(f[n-1]+k)%n
    这样的话我们要想办法除去这些冗杂的过程

    这样我们假设n很大的时候 要很多次才需要%mod 所以我们可以加速这个过程
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long
    using std::min;
    LL n,k,ly,now,lv;
    int main(){
        scanf("%lld %lld",&n,&k);
        ly=1; now=0;
        if(n<=5000){
            while(ly<n) now=(now+k)%(++ly);
            printf("%lld
    ",now+1);
        }
        else{
            while(ly<4*k) now=(now+k)%(++ly);
            while(ly<n){
                lv=min((ly-now)/k,n-ly-1);
                now=now+lv*k; ly+=lv;
                now=(now+k)%(++ly);
            }printf("%lld
    ",now+1);
        }
        return 0;
    }
    View Code
    
    
    
     
     
  • 相关阅读:
    13、文件修改及函数的基本使用
    12、文件处理 b模式
    作业3月16号
    作业3月13号
    11、文件处理 t模式
    10、数据类型内置之集合
    作业3月11号
    9、基础类型之列表、元组、字典
    作业3月10号
    8、for循环以及数字类型和字符串类型的内置方法
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/7694657.html
Copyright © 2020-2023  润新知