Cod sursa(job #3259973)

Utilizator n6v26rDedu Razvan Matei n6v26r Data 28 noiembrie 2024 17:20:07
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#pragma GCC optimize("Ofast,unroll-loops")

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <bits/stdc++.h>

using namespace std;

#define MAXN 10000001
#define MAXCIF 10

int n;
int v[MAXN];

vector<int> bucket[10];

int main(){
  FILE *fin, *fout;
  fin = fopen("radixsort.in", "r");
  int a,b,c;
  fscanf(fin, "%d%d%d%d", &n, &a, &b, &c);
  v[0] = b;
  for(int i=1; i<n; i++){
    v[i] = (a*v[i-1]+b)%c;
  }
  fclose(fin);
  int p10 = 1;
  for(int i=1; i<=MAXCIF; i++){
    for(int i=0; i<n; i++){
      bucket[v[i]/p10%10].push_back(v[i]);
    }
    memset(v, 0, sizeof(v));
    int j = 0;

    //printf("BUCKETS:\n");
    for(int i=0; i<10; i++){
      //printf("%d:", i);
      for(auto y: bucket[i]){
      //  printf("%d ", y);
        v[j++] = y;
      }
      //printf("\n");
      bucket[i].clear();
    }
    p10*=10;
    /*printf("ARRAY:\n");
    for(int i=0; i<n; i++){
      printf("%d ", v[i]);
    }
    printf("\n\n");*/
  }
  fout = fopen("radixsort.out", "w");
  for(int i=0; i<n; i+=10){
    fprintf(fout, "%d ", v[i]);
  }
  fprintf(fout, "\n");
  fclose(fout);
}