约瑟夫的变形,f[i]表示第i次出列的人的编号
推倒公式为f[i] = (f[i-1]+m-1)%(n-i+1);
i表示的是第几次出列,不是下面程序的i- -!!!
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int ans[15];
int solve(int k){
int n = k<<1;
bool loca ;
for(int i = k+1;;i++){
int f = 0;
loca =true;
for(int j = n;j>=k+1;j--){
f = (f+i-1)%j;
if(f<k){
loca = false;
break;
}
}
if(loca)return i;
}
return 0;
}
int main()
{
int k;
while(scanf("%d",&k),k!=0){
if(!ans[k])printf("%d\n",ans[k] = solve(k));
else printf("%d\n",ans[k]);
}
getchar();getchar();getchar();getchar();
return 0;
}