Numarare (Timisoara - pregatire, ian. 1996)

       Numerele de la 1 la n sunt asezate in ordine crescatoare  pe
   circumferinta unui cerc astfel ca n ajunge linga 1. Incepind  cu
   numarul s se marcheaza din k in k, in ordinea crescatoare a lor,
   pina cind un numar este marcat de 2 ori.
   a) Cite numere au ramas nemarcate?
   b) Listati numerele marcate in ordinea marcarii lor.

   ex:      1      n=8
          8   2    s=2
         7     3   k=5
          6   4
            5
   numere nemarcate: 0
   numerele marcate sunt in ordine: 2,7,4,1,6,3,8,5,2

       Datele se citesc din fisierul de intrare INT9.TXT. O secventa
   de intrare contine pe o linie datele n s k. Se pot citi mai multe
   secvente de date despartite printr-o linie libera.
       Rezultatele se depun in fisierul de iesire OUT9.TXT.
   ex:
   INT9.TXT contine:
   8 2 5

   OUT9.TXT contine rezultatul corect:
   0
   2 7 4 1 6 3 8 5 2
------------------------------------------------------------
Rezolvare (Mihai Stroe)
  Problema se rezolva matematic.Se marcheaza la pasul i numarul
  (s+i*k)mod n+n*byte((s+i*k)mod n=0).
  Exemplu:
  8 2 5

  2=(2+0*5) mod 8 + 8*0
  7=(2+1*5) mod 8 + 8*0
  4=(2+2*5) mod 8 + 8*0
  1=(2+3*5) mod 8 + 8*0
  6=(2+4*5) mod 8 + 8*0
  3=(2+5*5) mod 8 + 8*0
  8=(2+6*5) mod 8 + 8*1
  5=(2+7*5) mod 8 + 8*0
  2=(2+8*5) mod 8 + 8*0

var a:array[0..100]of byte;
    se:set of byte;
    n,s,k,i,j:integer;
    fi,fo:text;

begin
  assign(fi,'int9.txt');
  reset(fi);
  assign(fo,'out9.txt');
  rewrite(fo);
  while not eof(fi) do
    begin
      readln(fi,n,s,k);
      readln(fi);
      i:=0;
      se:=[];
      while not((s+i*k)mod n+n*byte((s+i*k)mod n=0)in se) do
        begin
          a[i]:=(s+i*k)mod n+n*byte((s+i*k)mod n=0);
          se:=se+[(s+i*k)mod n+n*byte((s+i*k)mod n=0)];
          inc(i);
        end;
      writeln(fo,n-i);
      for j:=0 to i-1 do write(fo,a[j],' ');
      writeln(fo,a[0]);
      writeln(fo);
      fillchar(a,sizeof(a),0);
      se:=[];
   end;
  close(fi);
  close(fo);
end.
