约瑟夫问题

来源:互联网 发布:阳光优化整合 编辑:程序博客网 时间:2024/06/03 15:40
#include <cstdio>int nn,mm,T;int Josephus_1(int n,int m){    //O(n)    int s=1;    for (int i=2; i<=n; i++)        s=(s+m-1)%i+1;    return s;}int Josephus_2(int n,int m){    //O(m)    int s=1,x;    if (m==1) return n;    for (int i=2; i<=n; i++){        x=(i-s)/m;        if (i+x-1>=n) return s+m*(n-i+1);        s=s+m*x,i+=x-1;        i++,s=(s+m-1)%i+1;    }    return s;}int main(){    freopen("1.txt","r",stdin);    for (scanf("%d",&T); T--; ){        scanf("%d%d",&nn,&mm);        printf("%d ",Josephus_1(nn,mm));        printf("%d\n",Josephus_2(nn,mm));    }}
原创粉丝点击