2318 - 约瑟夫问题
有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后一个人出列为止。
Input
输入只有一行,包括2个整数M(8 <= M <= 15 ),N( 5 <= N <= 32767 )。之间用一个空格分开。
Output
输出M行,每行一个整数。
Examples
Input
9 6
Output
6 3 1 9 2 5 4 8 7
Solution C
#include<stdio.h> int main() { int m,n,a[16],i,j,k,q,p,chu; scanf ("%d%d",&m,&n); for (i = 1;i <= m;i++) a[i] = i; k = 0; p = m; chu = n; for (j = 0;j < m;j++) { if (n > p&&n%p !=0) chu = n%p; else if(n > p&&n%p ==0) chu = p; else chu = n; for (i = k+1;;i++) { if (i > m) i = 1; if (a[i] == 0) continue; if (a[i]%chu == 0) { printf ("%d\n",i); if (p != 1) a[i] = 0; break; } } for (k = i+1,q = 1;;k++) { if (k > m) k = 1; if (k+1 == i+1&&q != 1) break; if (a[k] == 0) continue; a[k] = q; q++; } p--; } return 0; }
Solution C++
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #define LL long long #define ULL unsigned long long #define DB double #define FO(i,n) for(LL i=0;i<n;i++) #define FOD(i,n) for(LL i=n-(LL)1;i>=0;i--) #define FOR(i,a,b,c) for(LL i=a;i<=b;i+=c) #define FORD(i,a,b,c) for(LL i=a;i>=b;i-=c) #define MS(a,b) memset(a,b,sizeof(a)) using namespace std; bool vis[20]; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // ONLINE_JUDGE int n,m; scanf("%d%d",&n,&m); MS(vis,0); int wz=0; FO(i,n) { int ans; int cs=m; int xx=0; while(1) { if(wz==n) wz=0; if(!vis[wz]) xx++; if(xx==cs) {ans=wz+1;xx=0;vis[wz]=true;break;} wz++; } printf("%d\n",ans); } return 0; }