Cod sursa(job #2611789)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 7 mai 2020 16:32:36
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;

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

const int NMAX = 10000000;
const int NB = 8;
const int BASE = (1<<NB);
const int NC = (32 + NB - 1) / NB;

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

int main() {
    ios::sync_with_stdio(false);
    int n, a, b, c;
    fin>>n>>a>>b>>c;

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

    int m = BASE - 1;
    for( int k = 0; k < NC; k ++ ) {
      int l1 = k & 1;
      int l2 = (k + 1) & 1;
      int nb = k * NB;
      for( int j = 0; j < BASE; j ++ )
        nr[j] = 0;
      for( int i = 1; i <= n; i ++ ) {
        int cif = (v[l1][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[l1][i]>>nb)&m;
        v[l2][poz[cif] ++] = v[l1][i];
      }
    }
    int l = NC & 1;
    for( int i = 1; i <= n; i +=10 )
      fout<<v[l][i]<<" ";
    return 0;
}