/*ヨセフスの問題　制作：HAL*/

/*
[ヨセフスの問題とは]

1,2,3,4,5,6,7,8,9,11,12

の12人がいる。
1の人から順に一つ間隔おきに殺されていく。
一周すると

1,3,5,7,9,11

となり、二周目以降も一つ間隔おきに殺されるので

1,5,9

となる。9の次は1にあたるので三周目は

5

だけが残る。
この５というのが答え。（生き残る人）


[答え一覧（間隔１）]
 1人--->ans=   1
 2人--->ans=   1
 3人--->ans=   3
 4人--->ans=   1
 5人--->ans=   3
 6人--->ans=   5
 7人--->ans=   7
 8人--->ans=   1
 9人--->ans=   3
10人--->ans=   5
11人--->ans=   7
12人--->ans=   9
13人--->ans=  11
14人--->ans=  13
15人--->ans=  15
16人--->ans=   1
17人--->ans=   3
18人--->ans=   5
19人--->ans=   7
20人--->ans=   9

※間隔が1のときは、人数を左に１ビット循環シフト
したものが答え。例：12人(1100)→Ans.9(1001)

[答え一覧（間隔２）]
 1人--->ans=   1
 2人--->ans=   2
 3人--->ans=   2
 4人--->ans=   1
 5人--->ans=   4
 6人--->ans=   1
 7人--->ans=   4
 8人--->ans=   7
 9人--->ans=   1
10人--->ans=   4
11人--->ans=   7
12人--->ans=  10
13人--->ans=  13
14人--->ans=   2
15人--->ans=   5
16人--->ans=   8
17人--->ans=  11
18人--->ans=  14
19人--->ans=  17
20人--->ans=  20
*/


#include<stdio.h>
#include<stdlib.h>

#define MAX 5000

#define TRUE 1
#define FALSE 0

typedef int BOOL;

/*人構造*/
struct _list{
	BOOL alive;/*生きてるか*/
}list[MAX];

/*状態構造*/
struct _state{
	int num;/*人数*/
	int div;/*飛ばし人数*/
	BOOL all_flag;/*一覧表示フラグ*/
	int loop_count;/*ループ回数*/
}state;


/********************************************************************************/
/*                                                                              */
/*  初期化                                                                      */
/*                                                                              */
/********************************************************************************/
void init(){
	int i;
	for(i=0;i<state.num;i++){
		list[i].alive=TRUE;
	}
	state.loop_count=0;
}

/********************************************************************************/
/*                                                                              */
/*  状態表示                                                                    */
/*                                                                              */
/********************************************************************************/
void disp(){
	int i;

	for(i=0;i<state.num;i++){
		printf("%d",list[i].alive);
	}
	putchar('\n');
}

/********************************************************************************/
/*                                                                              */
/*  解く                                                                        */
/*                                                                              */
/********************************************************************************/
void solve(){
	int i,count,point=-1;
	BOOL end_flag=FALSE,find_flag;

	init();

	while(TRUE){
		if(!state.all_flag){disp();}
		end_flag=TRUE;
		for(i=0;i<state.num;i++){
			if(list[i].alive){
				end_flag=FALSE;
			}
		}
		if(end_flag){break;}

		count=0;
		find_flag=FALSE;
		i=point;
		while(TRUE){
			i++;
			if(i==state.num){
				state.loop_count++;/*周カウント*/
				i=0;
			}

			if(list[i].alive){count++;}
			if(count == state.div){
				point=i;
				find_flag=TRUE;
				break;
			}
		}
		list[point].alive=FALSE;
	}

	printf("ans=%4d,loop_count=%2d\n",point+1,state.loop_count);
}

/********************************************************************************/
/*                                                                              */
/*  メイン関数                                                                  */
/*                                                                              */
/********************************************************************************/
int main(int argc,char *argv[]){
	int max,i;

	if(argc!=4){
		printf("[引数] 一覧表示か？(yes=1,no=0), 最大人数(or指定人数）, 何人飛ばしか",argc);
		return 1;
	}

	state.all_flag=atoi(argv[1]);
	if(state.all_flag){
		max=atoi(argv[2]);
	}else{
		state.num = atoi(argv[2]);
	}
	state.div = atoi(argv[3]);

	if(state.num >= MAX || max >= MAX){
		puts("人数多すぎ");
		return 1;
	}

	if(state.num==0){
		state.all_flag=TRUE;
		for(i=1;i<max;i++){
			printf("%4d人--->",i);
			state.num = i;
			solve();
		}
	}else{
		state.all_flag=FALSE;
		solve();
	}
	return 0;
}


