游客 Signup | Login
中文 | En

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








Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题