Cod sursa(job #2508479)

Utilizator bullseYeIacob Sergiu bullseYe Data 12 decembrie 2019 12:02:21
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
#define DMAX 1000010

using namespace std;

int numbers[2][DMAX];
int which;
int N, A, B, C;

void radixSort(int[][DMAX], int);
void sortByDigit(int[][DMAX], int, int);

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

int main()
{
    fin >> N >> A >> B >> C;
    numbers[0][0] = B % C;
    for (int i = 1; i < N; i++)
    {
        numbers[0][i] = (1LL * A * numbers[0][i - 1] % C + B) % C;
        cout << numbers[0][i] << ' ';
    }
    fin.close();

    radixSort(numbers, N);

    for (int i = 0; i < N; i+=10)
        fout << numbers[which][i] << " ";
    fout << "\n";
    fout.close();
    return 0;
}

void radixSort(int numbers[][DMAX], int n)
{
    int maximus = numbers[which][0];
    for (int i = 1; i < n; ++i)
        maximus = max(numbers[which][i], maximus);

    for (int p10 = 1; maximus / p10 > 0; p10 *= 10)
    {
        sortByDigit(numbers, n, p10);
        which = 1 - which;
    }
}

void sortByDigit(int numbers[][DMAX], int n, int p10)
{
    int digits[10] = {0};
    for (int i = 0; i < n; ++i)
        ++digits[numbers[which][i] / p10 % 10];

    for (int i = 1; i < 10; ++i)
        digits[i] += digits[i - 1];

    for (int i = n - 1; i >= 0; --i)
        numbers[1 - which][--digits[numbers[which][i] / p10 % 10]] = numbers[which][i];
}