典型的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; }
时间: 2025-01-08 10:40:47