/* Dados dois inteiros N e M, este programa devolve a ordem (permutação) dos
   números 1,...,N gerada pelo processo de Josephus (com o próximo M-ésimo
   elemento ainda vivo sendo o próximo da permutação sendo gerada).  Por
   exemplo, com N=9 e M=5, a saída é a permutação 5 1 7 4 3 6 9 2 8.
*/

#include <stdio.h>

/* A situação do jogo será representada por uma lista circular, cujos
   elementos são do tipo No. */ 

typedef struct no_struct {
  int chave;
  struct no_struct *prox;
} No;

main()
{
  int i, N, M;

  No *t, *x;
  scanf("%d %d", &N, &M);

  /* geramos agora a lista circular inicial */
  t=(No *)malloc(sizeof(No));
  t->chave=1;
  x=t;
  for (i=2; i<=N; i++) {
    t->prox=(No *)malloc(sizeof(No));
    t=t->prox;
    t->chave=i;
  }
  t->prox=x;
  /* acabamos de fechar a nossa lista circular */
  
  while (t!=t->prox) { /* enquanto tivermos mais de 1 elemento */ 
    for (i=1; i<M; i++) t=t->prox; /* avançamos na lista M-1 vezes */
    printf("%d ", t->prox->chave);

    /* agora precisamos eliminar o elemento t->prox da lista */
    x=t->prox;
    t->prox=t->prox->prox;
    free(x);
  }
  /* não devemos nos esquecer de imprimir o último elemento da seqüência */ 
  printf("%d\n", t->chave);
}
