Cod sursa(job #3353998)

Utilizator radu._.21Radu Pelea radu._.21 Data 13 mai 2026 12:36:32
Problema Radix Sort Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int MAXN = 10000005;
// Folosim int normal (32 biți -> 4 bytes).
// v ia 40 MB, temp ia 40 MB. Total 80 MB, perfect pentru limita de 128 MB.
int v[MAXN];
int temp[MAXN];
int cnt[256];

void radixsort(int n) {
    // Un int pe 32 de biți are 4 secțiuni de 8 biți.
    // shift = 0 (primii 8 biți), shift = 8 (următorii 8 biți), etc.
    for (int shift = 0; shift < 32; shift += 8) {

        // Resetăm vectorul de frecvență
        for (int i = 0; i < 256; i++) {
            cnt[i] = 0;
        }

        // 1. Numărăm de câte ori apare fiecare "cifră" în baza 256
        // (v[i] >> shift) & 255 extrage exact secțiunea de 8 biți de care avem nevoie
        for (int i = 1; i <= n; i++) {
            int cifra = (v[i] >> shift) & 255;
            cnt[cifra]++;
        }

        // 2. Transformăm frecvențele în poziții.
        // cnt[i] va reține ultima poziție unde trebuie pus un element cu cifra 'i'
        for (int i = 1; i < 256; i++) {
            cnt[i] += cnt[i - 1];
        }

        // 3. Punem elementele la locul lor în vectorul temporar,
        // mergând de la capăt spre început pentru a menține stabilitatea sortării.
        for (int i = n; i >= 1; i--) {
            int cifra = (v[i] >> shift) & 255;
            temp[cnt[cifra]] = v[i];
            cnt[cifra]--; // Scădem pentru a face loc următorului element cu aceeași cifră
        }

        // 4. Copiem elementele sortate înapoi în vectorul original
        for (int i = 1; i <= n; i++) {
            v[i] = temp[i];
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    fin.tie(NULL);

    int n, a, b, c;
    fin >> n >> a >> b >> c;

    // Generăm vectorul conform formulei
    v[1] = b;
    for (int i = 2; i <= n; i++) {
        v[i] = (1LL * a * v[i - 1] + b) % c; // 1LL e necesar aici ca să nu se piardă biți la înmulțire
    }

    radixsort(n);

    // Afișăm din 10 în 10
    for (int i = 1; i <= n; i += 10) {
        fout << v[i] << " ";
    }

    return 0;
}