Cod sursa(job #2167870)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 14 martie 2018 00:20:56
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.39 kb
#include <iostream>
#include <cstdio>

using namespace std;

#define NMAX 10000001

long long num[NMAX];
int bucket[10][NMAX];

int main()
{
    freopen("radixsort.in", "r", stdin);
    freopen("radixsort.out" , "w", stdout);
    int n, a, b, c;
    scanf("%d%d%d%d", &n, &a, &b, &c);
    num[1] = (long long)b;
    long long maxim = (long long)b;
    for(int i = 2; i <= n; ++i){
        num[i] = (a * num[i - 1] + b) % c;
        if(num[i] > maxim) maxim = num[i];
    }
    long long zece = 1LL;
    while(zece <= maxim){
        if(zece > maxim)
            break;
        int len0 = 0, len1 = 0, len2 = 0, len3 = 0, len4 = 0, len5 = 0, len6 = 0, len7 = 0, len8 = 0, len9 = 0, maxlen = 0;
        for(int i = 1; i <= n; ++i){
            if((num[i] / zece) % 10 == 0) bucket[(num[i] / zece) % 10][++len0] = num[i];
            if((num[i] / zece) % 10 == 1) bucket[(num[i] / zece) % 10][++len1] = num[i];
            if((num[i] / zece) % 10 == 2) bucket[(num[i] / zece) % 10][++len2] = num[i];
            if((num[i] / zece) % 10 == 3) bucket[(num[i] / zece) % 10][++len3] = num[i];
            if((num[i] / zece) % 10 == 4) bucket[(num[i] / zece) % 10][++len4] = num[i];
            if((num[i] / zece) % 10 == 5) bucket[(num[i] / zece) % 10][++len5] = num[i];
            if((num[i] / zece) % 10 == 6) bucket[(num[i] / zece) % 10][++len6] = num[i];
            if((num[i] / zece) % 10 == 7) bucket[(num[i] / zece) % 10][++len7] = num[i];
            if((num[i] / zece) % 10 == 8) bucket[(num[i] / zece) % 10][++len8] = num[i];
            if((num[i] / zece) % 10 == 9) bucket[(num[i] / zece) % 10][++len9] = num[i];
        }
        int index = 0;
        for(int i = 1; i <= len0; ++i) num[++index] = bucket[0][i];
        for(int i = 1; i <= len1; ++i) num[++index] = bucket[1][i];
        for(int i = 1; i <= len2; ++i) num[++index] = bucket[2][i];
        for(int i = 1; i <= len3; ++i) num[++index] = bucket[3][i];
        for(int i = 1; i <= len4; ++i) num[++index] = bucket[4][i];
        for(int i = 1; i <= len5; ++i) num[++index] = bucket[5][i];
        for(int i = 1; i <= len6; ++i) num[++index] = bucket[6][i];
        for(int i = 1; i <= len7; ++i) num[++index] = bucket[7][i];
        for(int i = 1; i <= len8; ++i) num[++index] = bucket[8][i];
        for(int i = 1; i <= len9; ++i) num[++index] = bucket[9][i];
        zece *= 10LL;
    }
    for(int i = 1; i <= n; i += 10)
        printf("%lld ", num[i]);
    return 0;
}