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;
}