Cod sursa(job #2625449)

Utilizator SirbuSirbu Ioan Sirbu Data 5 iunie 2020 23:02:07
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <bits/stdc++.h>

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

int main() {

    long long N, A, B, C;
    fin >> N >> A >> B >> C;
    vector <int> v(N);
    v[0] = B;
    for(int i = 1; i < N; ++i)
        v[i] = (A * v[i-1] + B) % C;

    const int exp = 8;
    int base = (1 << exp);
    vector <int> aparitii (base);
    vector <int> output(N);

    for (int shift = 0; shift < 32/exp; ++shift) {
        for (int i = 0; i < N; ++i)
            aparitii[(v[i] >> (exp*shift)) & (base-1)]++;

        for (int i = 1; i < base; ++i)
            aparitii[i] += aparitii[i-1];

        for (int i = N - 1; i >= 0; --i) {
            aparitii[(v[i] >> (exp*shift)) & (base-1)]--;
            output[aparitii[(v[i] >> (exp*shift)) & (base-1)]] = v[i];
        }

        for (int i = 0; i < N; ++i)
            v[i] = output[i];

        for (int i = 0; i < base; ++i)
            aparitii[i] = 0;
    }
    for (int i = 0; i < N; i+=10)
        fout << output[i] << ' ';
    return 0;
}