Sigui y (modm) l’equivalent matemàtic de y%m en C++. Una manera habitual d’aconseguir una seqüència de nombres pseudo-aleatoris consisteix a triar tres naturals a, b i m, i un nombre inicial x0, i calcular cada xi+1 a partir d’xi, fent servir aquesta igualtat:
xi+1 = (a · xi + b)(mod m ) . |
Algunes combinacions produeixen seqüències que poden semblar realment aleatòries. Per exemple, amb a = 10, b = 7, m = 23, i x0 = 4, obtenim 4, 1, 17, 16, 6, 21, 10, 15, …Però amb a = 2, b = 50, m = 100, i x0 = 0 obtenim 0, 50, 50, 50, …
Diverses mesures estadístiques sobre les seqüències generades en permeten estimar com s’assemblen a seqüències realment aleatòries. Feu un programa que en calculi algunes: la mitjana dels nombres obtinguts, la longitud de la subseqüència consecutiva estrictament creixent més llarga, i la longitud de la subseqüència consecutiva estrictament decreixent més llarga.
Entrada
L’entrada consisteix en diversos casos, cadascuna amb cincs naturals a, b, m, x0 i p. Aquest últim és el nombre d’elements de la seqüència que cal generar. Suposeu 2 ≤ m ≤ 30000, que a, b i x0 es troben entre 0 i m − 1, i p ≥ 1.
Sortida
Per a cada cas, escriviu les tres quantitats demanades, la primera amb dos decimals de precisió. Per fer-ho, poseu aquestes dues línies al principi del vostre main:
cout.setf(ios::fixed); cout.precision(2);
Input
10 7 23 4 8 2 50 100 0 4 1 0 2 0 1
Output
11.25 2 3 37.50 2 1 0.00 1 1