Un camí aleatori consisteix en una seqüència de posicions, cadascuna de les quals s’obté a partir de l’anterior fent un pas aleatori. En aquest exercici considerem camins aleatoris en el pla, amb inici a . Sigui un natural esctrictament positiu. Cada pas serà un increment entre i , aleatori i independent, de les dues coordenades.
Ens cal doncs una font d’atzar. La manera habitual de simular-lo consisteix a generar nombres pseudoaleatoris. Aquests nombres s’obtenen amb un algorisme, i per tant no són realment aleatoris, però ho semblen prou. Els generadors lineals congruencials es defineixen amb quatre naturals (mòdul), (multiplicador), (sumador) i (llavor inicial). La seqüència generada és
Per exemple, si , llavors obtenim
Aquests nombres es troben tots entre 0 i , però en aquest exercici ens cal passar-los a nombres entre i . La manera més simple és la del codi següent; useu-lo tal qual:
int atzar(int k, int m, int a, int b, int& s) {
s = (a*s + b)%m;
return s%(2*k + 1) - k;
}
Seguint amb l’exemple, per a la seqüència d’increments és i, si incrementem la primera coordenada abans que la segona, els passos són
Feu un programa que calculi els primers passos d’una sèrie de camins aleatoris definits amb , , , i .
L’entrada són tot nombres naturals, i consisteix en una sèrie de casos, cadascun en dues línies. La primera línia conté i . La segona línia conté , , i . Tant com com són estrictament positius, i tant com com són més petits que .
Per a cada cas de l’entrada, escriviu primer el seu número començant en 1, seguit del camí de passos definit amb , , , i . Si alguna posició es repeteix, cal indicar-ho i aturar el camí tal i com es pot veure a l’exemple. Escriviu una línia en blanc al final de cada cas.
Input
5 2 9 2 7 3 8 1 7 2 0 5 12 100 1007 74 985 333
Output
Cami #1 (0, 0) (2, -1) (1, -3) (1, -2) (3, -3) Cami #2 (0, 0) (-1, -1) (0, -2) (-1, -1) repetit! Cami #3 (0, 0) (-50, 95) (-41, 156) (-19, 202) (73, 102) (94, 14) (-4, -18) (-16, -102) (11, -7) (-10, 79) (51, 73) (122, 1)