Cod sursa(job #2225805)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 28 iulie 2018 12:31:54
Problema Radix Sort Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

FILE *f1 = fopen("radixsort.in", "r");
FILE *f2 = fopen("radixsort.out", "w");

queue<int> counter[256], aux_counter[256];
unsigned int aux;

int main() {
    
    int n, a, b, c, i, j;
    
    fscanf(f1, "%d%d%d%d", &n, &a, &b, &c);
    fclose(f1);
    
    int cr, prev;
    
    // byte 0
    cr = b;
    aux = cr & 255;
    counter[aux].push(cr);
    prev = cr;
    
    for (i = 2; i <= n; i++) {
        cr = ((1LL * a * prev) % c + b) % c;
        aux = cr & 255;
        counter[aux].push(cr);
        prev = cr;
    }
    
    // byte 1
    
    for (i = 0; i < 256; i++) {
        
        while (!counter[i].empty()) {
            cr = counter[i].front();
            counter[i].pop();
            aux = (cr >> 8) & 255;
            aux_counter[aux].push(cr);
        }
    }
    
    // byte 2
    
    for (i = 0; i < 256; i++) {
        
        while (!aux_counter[i].empty()) {
            cr = aux_counter[i].front();
            aux_counter[i].pop();
            aux = (cr >> 16) & 255;
            counter[aux].push(cr);
        }
    }
    
    // byte 3
    
    for (i = 0; i < 256; i++) {
        
        while (!counter[i].empty()) {
            cr = counter[i].front();
            counter[i].pop();
            aux = (cr >> 24) & 255;
            aux_counter[aux].push(cr);
        }
    }
    
    // print
    prev = 0;
    for (i = 0; i < 256; i++) {
        
        while (!aux_counter[i].empty()) {
            cr = aux_counter[i].front();
            aux_counter[i].pop();
            if (prev % 10 == 0) {
                fprintf(f2, "%d ", cr);
                prev = 1;
            }
            else prev++;
        }
    }
    
    fclose(f2);    
    
    return 0;
}