Cod sursa(job #2509062)

Utilizator SahMatCodrea Andrei SahMat Data 13 decembrie 2019 18:56:04
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <cstring>

using namespace std;

const int baza = 1000;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
int n, grup3, v[10000001], w[10000001], p1000;

void repartizare (int a[], int b[]) {
  int d, c, cc[baza], i, l[baza], cif;
  memset (cc, 0, sizeof cc);
  for (i = 1; i <= n; i++) {
    c = a[i] / p1000 % baza; // cifra in baza baza
    cc[c]++; // contor pentru fiecare cifra
  }
  l[0] = 1;
  for (cif = 1; cif <= 999; cif++)
    l[cif] = l[cif - 1] + cc[cif - 1];
  for (i = 1; i <= n; i++) {
    c = a[i] / p1000 % baza; // cifra in baza baza
    d = l[c]++; // Destinatia urmatoare va fi mai mare cu 1.
    b[d] = a[i];
  }
}

int main() {
  int a, b, c, i;
  fin >> n >> a >> b >> c;
  v[1] = b;
  for (i = 2; i <= n; i++)
    v[i] = (((long long)a * v[i-1]) % c + b) % c;
  p1000 = 1;
  for (grup3 = 0; grup3 <= 3; grup3++, p1000 *= 1000)
    if (grup3 % 2 == 0)
      repartizare(v, w);
    else
      repartizare(w, v);
  for (i = 1; i <= n; i += 10)
    fout << v[i] << ' '; // se cere sa afisam elemente din 10 in 10
}