Cod sursa(job #2611762)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 7 mai 2020 16:15:52
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("radixsort.in");
ofstream fout("radixsort.out");

const int NMAX = 10000000;
const int NB = 8;
const int BASE = (1<<NB);

int v[2][NMAX + 1];
int nr[BASE + 1];
int poz[BASE + 1];

int getMaxdigits( int val ) {
  int pow = 1, nr = 0;
  while( pow < val )
    pow = pow * BASE, nr ++;
  return nr;
}

int main() {
    int n, a, b, c, nc;
    fin>>n>>a>>b>>c;

    v[0][1] = b;
    nc = 0;
    nc = max(nc, getMaxdigits(v[0][1]));
    for( int i = 2; i <= n; i ++ )
      v[0][i] = (a * v[0][i-1] + b) % c, nc = max(nc, getMaxdigits(v[0][i]));

    int m = BASE - 1;
    for( int k = 0; k < nc; k ++ ) {
      int nb = k * NB;
      for( int j = 0; j < BASE; j ++ )
        nr[j] = 0;
      for( int i = 1; i <= n; i ++ ) {
        int cif = (v[k & 1][i]>>nb)&m;
        nr[cif] ++;
      }
      poz[0] = 1;
      for( int j = 1; j < BASE; j ++ ) {
        poz[j] = poz[j - 1] + nr[j - 1];
      }
      for( int i = 1; i <= n; i ++ ) {
        int cif = (v[k & 1][i]>>nb)&m;
        v[(k+1) & 1][poz[cif] ++] = v[k & 1][i];
      }
    }
    for( int i = 1; i <= n; i ++ )
      if( !( ( i - 1 ) % 10 ) )
      fout<<v[nc & 1][i]<<" ";
    return 0;
}