#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <functional>
#include <map>
using namespace std;
int joseph_m(int k)
{
vector<int> vint,vint_b;
int i,j,m;
int boys;
for(i = 0; i < 2*k; i++)
vint.push_back(i+1);
vint_b = vint;
for(m = k+1;; ++m)
{
boys = 2*k;//总共有2k个男孩,前k个是good boys
j = 0;
vint = vint_b;
for(i = 0; i < k; i++)//内部循环k次删除k个男孩
{
j = m%boys;
if(j == 0)j = boys;
if(vint[j-1] >= 1 && vint[j-1] <= k)break;
vint.erase(vint.begin()+j-1);
if(j != boys)
rotate(vint.begin(),vint.begin()+j-1,vint.end());
--boys;
}
if(i == k)break;
}
return m;
}
void init(vector<int>& vint)
{
vint.push_back(0);
vint.push_back(2);
vint.push_back(7);
vint.push_back(5);
vint.push_back(30);
vint.push_back(169);
vint.push_back(441);
vint.push_back(1872);
vint.push_back(7632);
vint.push_back(1740);
vint.push_back(93313);
vint.push_back(459901);
vint.push_back(1358657);
vint.push_back(2504881);
vint.push_back(5);
vint.push_back(30);
}
int main()
{
//freopen("in.txt","r",stdin);
vector<int> vint;
init(vint);
int k; // 0 < k < 14
while(cin>>k && k != 0)
{
//cout<<joseph_m(k)<<endl;
cout<<vint[k]<<endl;
}
return 1;
}
这一题没找到什么好方法,抄了一条捷径,就是先用笨方法把1-14的输入对应的m计算出来,然后把它写到表中,直接查表,输出。