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;
}

浙公网安备 33010602011771号