P1996||T1282 约瑟夫问题 洛谷||codevs
https://www.luogu.org/problem/show?pid=1996||http://codevs.cn/problem/1282/
题目背景
约瑟夫是一个无聊的人!!!
题目描述
n个人(n<=30000)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号.
输入输出格式
输入格式:
n m
输出格式:
出圈的编号
输入输出样例
输入样例#1:
10 3
输出样例#1:
3 6 9 2 7 1 8 5 10 4
说明
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdio> 4 #define N 30005 5 6 using namespace std; 7 8 int n,m,sum,k,now; 9 int que[N]; 10 bool vis[N]; 11 12 int main() 13 { 14 cin>>n>>m; 15 while(sum<n) 16 { 17 k++; 18 now++; 19 if(now==n+1) now=1; 20 if(vis[now]) 21 while(vis[now]) 22 { 23 now++; 24 if(now==n+1) 25 now=1; 26 } 27 if(k==m) 28 { 29 k=0; 30 printf("%d ",now); 31 vis[now]=1; 32 sum++; 33 } 34 } 35 return 0; 36 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdio> 4 #define N 30005 5 6 using namespace std; 7 8 int n,m,k,sum,now; 9 int que[N]; 10 11 int main() 12 { 13 cin>>n>>m; 14 for(int i=1;i<n;i++) 15 que[i]=i+1; 16 que[n]=1; 17 k=1; now=n; 18 while(sum<n) 19 { 20 while(k<m) 21 { 22 k++; 23 now=que[now]; 24 } 25 printf("%d ",que[now]); 26 sum++; 27 que[now]=que[que[now]]; 28 k=1; 29 } 30 return 0; 31 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 3 using namespace std; 4 5 int n,m,q[30005],now=1; 6 7 int main() 8 { 9 scanf("%d%d",&n,&m); 10 for(int i=1;i<=n;i++) q[i]=i; 11 while(n) 12 { 13 now=(now+m-1)%n; 14 if(now==0) now=n; 15 printf("%d ",q[now]); 16 for(int i=now;i<n;i++) q[i]=q[i+1]; 17 n--; 18 } 19 return 0; 20 }
——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。