Cod sursa(job #2609224)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 2 mai 2020 12:38:29
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>

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

const int NMAX = 1e7;
const int BASE = 1<<16;

long long v[1 + NMAX];
long long aux[1 + NMAX];
int poz[1 + BASE];
int nr[1 + BASE];

int main() {

    int N, A, B, C;

    fin >> N >> A >> B >> C;

    v[0] = B;

    for ( int i = 1; i < N; ++i )
        v[i] = ( A * v[i - 1] + B ) % C;
    
    int cif = 0;
    int tmp = C;

    while ( tmp ) {
        ++cif;
        tmp /= BASE;
    }

    long long p = 1;

    for ( int k = 0; k < cif; ++k ) {
        for ( int j = 0; j < BASE; ++j )
            nr[j] = 0;
        for ( int i = 0; i < N; ++i ) {
            int cf = v[i] / p % BASE;
            ++nr[cf];
        }
        poz[0] = 0;
        for ( int j = 1; j < BASE; ++j )
            poz[j] = poz[j - 1] + nr[j - 1];
        
        for ( int i = 0; i < N; ++i ) {
            int cf = v[i] / p % BASE;
            aux[poz[cf]++] = v[i];
        }

        for ( int i = 0; i < N; ++i )
            v[i] = aux[i];
        
        p *= BASE;
    }

    for ( int i = 0; i < N; i = i + 10 )
        fout << v[i] << ' ';
    
    fin.close();
    fout.close();

    return 0;
}