51nod 1074 约瑟夫环 V2

Posted 友人A

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\\n",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\\n",now+1);
    }
    return 0;
}
View Code

 

 

 

 

以上是关于51nod 1074 约瑟夫环 V2的主要内容,如果未能解决你的问题,请参考以下文章

1074 约瑟夫环 V2

51Nod 1073约瑟夫环

51nod 1073约瑟夫环

51nod 1073约瑟夫环 递归公式法

51Nod 1073 约瑟夫环

51nod1073-约瑟夫环,递归。