/*ヨセフスの問題 制作: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 だけが残る。 この5というのが答え。(生き残る人) [答え一覧(間隔1)] 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のときは、人数を左に1ビット循環シフト したものが答え。例:12人(1100)→Ans.9(1001) [答え一覧(間隔2)] 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 #include #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= MAX || max >= MAX){ puts("人数多すぎ"); return 1; } if(state.num==0){ state.all_flag=TRUE; for(i=1;i",i); state.num = i; solve(); } }else{ state.all_flag=FALSE; solve(); } return 0; }