Cod sursa(job #3292916)

Utilizator Sorin_GabrielGabara Sorin Gabriel Sorin_Gabriel Data 9 aprilie 2025 19:14:42
Problema Radix Sort Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#include <iostream>
#include <bits/stdc++.h>
#define VMAX 10000005
#define INF 2147000000
using namespace std;
ifstream fin ("radixsort.in");
ofstream fout ("radixsort.out");

int numere[2][VMAX];
int frcv[10];
int stanga[10];

long long int a,b,c;

signed main()
{
    long long int n,m,i,j,k,t,q,nr,p;
    bool turn;
    fin>>n>>a>>b>>c;
    nr=0;
    for(i=1;i<=n;i++)
    {
        nr=(a*nr+b)%c;
        numere[0][i]=nr;
    }

    for(p=1, turn = true;1;p*=10,turn=!turn)
    {
		for (i = 0; i < 10; ++i)
			frcv[i] = 0;

        for(j=1;j<=n;j++)
        {
            frcv[(numere[!turn][j]/p)%10]++;
        }

        if(frcv[0]==n)
            break;

        stanga[0]=1;
        for(i=1;i<10;i++)
            stanga[i]=stanga[i-1]+frcv[i-1];

        for(j=1;j<=n;j++)
        {
            numere[turn][stanga[(numere[!turn][j]/p)%10]++]=numere[!turn][j];
            //un numar din grupa j va avea stanga[j] numere in fata sa, iar fara cifra sata
            // ele sunt sortate crescator, deci in ordinea aparitiei, ele vor ocupa stanga[j], stanga[j+1]
            // deci putem face stanga[j]++ pentru a ajunge la acea pozitie
        }
    }

    for(i=1;i<=n;i+=10)
        fout<<numere[!turn][i]<<' ';
    fout<<'\n';

    return 0;
}