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

 

posted @ 2011-02-05 00:13  Faircoala  阅读(221)  评论(0编辑  收藏  举报