ZCMU——5022约瑟夫环

5022: 约瑟夫

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 212  Solved: 105
[Submit][Status][Web Board]

Description


在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。他们该如何逃脱这场死亡游戏。

n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.

Input

一行2个用空格隔开的整数n,m。

Output

一行用空格隔开的整数,表示出圈编号。

Sample Input

10 3

Sample Output

3 6 9 2 7 1 8 5 10 4

 蒟蒻用不来链表,呜呜呜~

#include<bits/stdc++.h>
#define ll long long
#define ve vector
#define mp map
#define NO cout<<"NO"<<endl;
#define YES cout<<"YES"<<endl;
#define pre(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,b,a) for(int i=b;i>=a;i--)
#define mem(a,b) memset(a,b,sizeof(a))
#define st string
#define N 10005
#define eps 1e-13
using namespace std;
const double pi =acos(-1.0);
const int maxn=1e6+5;
const ll mod =1e15;
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
//set<ll> s;
ve<ll> v;
priority_queue<ll, ve<ll>, greater<ll> >q;
int lcm(int a,int b){
    return a*b/__gcd(a,b);
}
bool isleaf(int x){
     return x%400==0||(x%4==0&&x%100==0);
}
int primes[N], cnt;
bool vis[N];
void is_prime(int x){
    vis[1] = vis[0] = 1;
    for(int i = 2; i <= x; ++ i){
        if(!vis[i])primes[cnt ++ ] = i;
        for(int j = 0; primes[j] * i <= x; ++ j){
            vis[primes[j] * i] = true;
            if(i % primes[j] == 0)break;
        }
    }
}//1e6;
ll qpow(ll a,ll n)//快速幂 ll mod=1e15;
{
    ll re=1;
    while(n)
    {
        if(n&1)
            re=(re*a)%mod;
        n>>=1;
        a=(a*a)%mod;
    }
    return re;
}
inline ll qmul(ll x,ll y,ll p)//快速乘 
{
    ll z=(long double)x/p*y;
    ll res=(unsigned long long)x*y-(unsigned long long)z*p;
    return (res+p)%p;
}
void pprint(char *);
struct ob
{
	char MC[100];
	double DJ;
	int SL;
};

int sum[maxn];
void iprime(){
	mem(sum,1);
	pre(i,2,maxn/2)
 	   for(int j=i*2;j<maxn;j+=i)
 	   	   sum[j]+=i;
}

bool isprime(int m){
	for(int i=2;i<=pow(m,0.5);i++){
		if(m%i==0) return false;
	}
	return true;
}
/*
next(数据) 1 2 3 4 5 6 7 8 9 10
            2 3 4 5 6 7 8 9 10 1
用next储存下一个 选中的元素  形成闭环 
next[1]=2;next[2]=3; 当选中的人出局,让next[2]=next[3]
于是next[2]=4;

*/
int next[N];

int main(){
	int n,m;
	int pp;
	cin>>n>>m;
	pre(i,0,n-1)next[i]=i+1;//初始化数组 
	next[n]=1;//第n个指向1,形成闭环 
	pre(i,1,n){
	   pre(j,1,m-1)
	       pp=next[pp];//指针不断向下 
        cout<<next[pp]<<" ";//出来吧你 
        next[pp]=next[next[pp]];//选中人后跳过该节点,依然是一个圈 
	}
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值