Cod sursa(job #1224508)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 31 august 2014 11:30:00
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAXN 10000010
#define BASE 10

using namespace std;

int a, b, c, n, v[MAXN], maxim;

void citire()
{
    scanf("%d%d%d%d", &n, &a, &b, &c);
    v[1] = b;
    for (int i = 2; i <= n; i++)
    {
        v[i] = (a * v[i-1] + b) % c;
        if (v[i] > maxim)
            maxim = v[i];
    }
}

void sol()
{
    vector<int> bucket[BASE];
    int m = maxim, len = 1, nq = 0;
    while (m != 0) {len *= BASE; m /= BASE;}
    for (int i = 1; i < len; i *= BASE)
    {
        nq = 1;
        for (int j = 1; j <= n; j++)
            bucket[(v[j] / i) % BASE].push_back(v[j]);
        for (int j = 0; j < BASE; j++)
        {
            for (int k = 0; k < bucket[j].size(); k++)
                v[nq++] = bucket[j][k];
            bucket[j].clear();
        }
    }
    for (int i = 1; i <= n; i += 10)
        printf("%d ", v[i]);

}

int main()
{
    freopen("radixsort.in", "r", stdin);
    freopen("radixsort.out", "w", stdout);

    citire();
    sol();

    return 0;
}