这个是约瑟夫的另一个变型,变为总共有2*k个人,先是K个好人后是k个坏人,要求前k次都要杀坏人,即在杀掉第一个好人之前就要把所有的坏人都杀光,所以需要我们求出满足这个条件的最小的m值;
由约瑟夫的递归模型可以发现,我们因为他的递归是从最后杀的人递归到原有的人数,所以我们可以吧顺序反过来,等价于最后杀掉k个坏人,再杀好人,这样在递归的时候就是先知道起始位置(先杀的人),这样就能迭代,由有好人时是否杀的是坏人来判定这个m是否适合,如果k次后杀到了第k个坏人则说明这个m是适合的
参考:http://www.cnblogs.com/wuzhibin/archive/2012/02/17/2356532.html
#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#include <string.h>
using namespace std;
int a[19];
int main()
{
int k,m,ans;
a[10]=93313;
a[11]=459901;
a[12]=1358657;
a[13]=2504881;
a[14]=13482720;
while(cin>>k)
{
if(k==0) break;
else if(k>=10) cout<<a[k]<<endl;
else
{
for(m=1;;m++)
{
for(ans=0;ans<k;ans++)
{
int j=ans;
for(int i=k+1;i<=2*k;i++)
j=(j+m)%i;
if(j>=k) break;
}
if(ans==k)
{
cout<<m<<endl;
break;
}
}
}
}
return 0;
}
因为oj上有时间限制,所以把大于10的都计算好了。。。这。。。