典型的Joseph问题……
由于数据范围小,直接暴力就可以解决了……
用到了链表的数据结构……
时间:90毫秒。
#include "stdio.h"
#include "string.h"
struct lianbiao{
int prev,next;
}p[152];
const int INF=2147483647;
void init(int n){
int i;
for(i=2;i<n;i++){
p[i].prev=i-1;
p[i].next=i+1;
}
p[1].prev=n;
p[1].next=2;
p[n].prev=n-1;
p[n].next=1;
}
void del(int x){
p[p[x].prev].next=p[x].next;
p[p[x].next].prev=p[x].prev;
}
int is_CGB_last(int n,int m){
int cnt,i,tmp;
init(n);
//printf("\n*******N = %d , M = %d .\n",n,m);
cnt=1;tmp=p[1].prev;del(1);
//printf("1 ( %d ) ",tmp);
while(cnt<n){
//printf("\n**cnt = %d .\n",cnt);
for(i=1;i<=m;i++){
tmp=p[tmp].next;
}
//printf("-> %d ( %d ) ",tmp,p[tmp].prev);
cnt++;
if((tmp==2)&&(cnt<n))return 0;
if((tmp==2)&&(cnt==n)){
//printf("\n");
return 1;
}
del(tmp);
tmp=p[tmp].prev;
}
printf("\n");
}
int main(){
int ans[152];
int n,m;
memset(ans,0,sizeof(ans));
while(1){
scanf("%d",&n);
if(!n)break;
if(ans[n]){
printf("%d\n",ans[n]);
continue;
}
for(m=2;m<=INF;m++){
if(is_CGB_last(n,m)){
printf("%d\n",m);
ans[n]=m;
break;
}
}
}
return 0;
}