Cod sursa(job #1793327)

Utilizator doruliqueDoru MODRISAN dorulique Data 30 octombrie 2016 22:09:16
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<cstdio>

int n,A,B,C,a[10000001],b[10000001],nr[11];

int main()
{
    FILE *f=fopen("radixsort.in","r");
    fscanf(f,"%d%d%d%d",&n,&A,&B,&C);
    int i;
    a[1]=B;
    for(i=2;i<=n;i++)
        a[i]=((long long)A*a[i-1]+B)%C;
    int poz,p=1;
    for(poz=1;poz<=10;poz++)//poz=pozitzia cifrei pe care o numar
    {//1=cifra unitatilor  2=cifra zecilor,  3=cifra sutelor, etc.
        //programul asta merge pt. numere de maxim 10 cifre (deci int)
        for(i=0;i<=9;i++)nr[i]=0;
        for(i=1;i<=n;i++)//numar in nr[x] = cite numere au cifra x-1 pe poz. poz
            nr[a[i]/p%10+1]++;
        nr[0]=1;
        for(i=0;i<=9;i++)nr[i+1]+=nr[i];
        //fac totalul pentru a sti pe ce pozitzie voi aduce fiecare set de numere
        //mai precis, prima aparitzie a unui numar care contzine cifra i pe pozitzia
        // poz va fi la indicele nr[i].
        //ideea e ca, dupa ce pun un numar pe pozitzia data de nr[i], il incrementez
        //nr[i] ca sa shtiu unde pun urmatorul numarul.
        for(i=1;i<=n;i++)
            b[nr[a[i]/p%10]++]=a[i];//adica fix ceea ce fac aici
        for(i=1;i<=n;i++)//so, in vectorul b le avem grupate pe seturi
            a[i]=b[i];//dupa valoarea cifrei de pe pozitzia poz
        p*=10;//trec la urmatoarea cifra, de pe urmatoarea pozitzie
    }
    f=fopen("radixsort.out","w");
    for(i=1;i<=n;i+=10)
        fprintf(f,"%d ",a[i]);
    fprintf(f,"\n");
    return 0;
}