POJ-1012-Joseph
原题只有13种输入,算出每种的结果再写个查表程序。
#include <stdio.h> int people[30]; int order(int k, int m); int main() { int k,i,m,flag; while(scanf("%d", &k) != EOF) { if(k == 0) break; m = k + 1; while(m) { if(m % (2 * k) == 1) { m += k; continue; } for(i=0; i<2*k; i++) { people[i] = i+1; } if(order(k, m)) { printf("%d\n", m); break; } m++; } } return 0; } int order(int k, int m) { int c,i,j,t; c = t = 0; for(i=2*k;i>k;i--) { c = (c + m - 1) % i; if(people[c] <= k) return 0; for(j=c;j<i-1;j++) people[j]=people[j+1]; } return 1; }
查表:
#include <stdio.h> int tab[] = { 2, 7, 5, 30, 169, 441, 1872, 7632, 1740, 93313, 459901, 1358657, 2504881}; int main() { int k,i,m,flag; while(scanf("%d", &k)) { if(k == 0) break; printf("%d\n", tab[k-1]); } return 0; }