Cod sursa(job #1887951)

Utilizator raduzxstefanescu radu raduzx Data 21 februarie 2017 20:49:56
Problema Radix Sort Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>

using namespace std;
ifstream f("radixsort.in");
ofstream g("radixsort.out");
int v[10000003];
int n;
typedef int ll;
typedef long long ll1;
ll getmax()
{
    ll i,maxim=0;
    for(i=1;i<=n;i++)
    {
        if(maxim<v[i])
            maxim=v[i];
    }
    return maxim;
}
void afisare(int a[])
{
    for(ll i=1;i<=n;i+=10)
        g<<a[i]<<" ";
}
ll cifre[12];
void radix(int a[],int b[],ll exp)
{
    ll i;
    for(i=0;i<=9;i++)
        cifre[i]=0;
    for(i=1;i<=n;i++)
        cifre[(a[i]/exp)%10]+=1;
    for(i=1;i<=9;i++)
        cifre[i]+=cifre[i-1];
    for(i=n;i>=1;i--)
    {
        b[cifre[(a[i]/exp)%10]]=a[i];
        cifre[(a[i]/exp)%10]-=1;
    }
}
 int output[10000003];
int main()
{
    ll1 j,a,b,c,exp,i,maxim;
    f>>n>>a>>b>>c;
    v[1]=b;
    for(i=2;i<=n;i++)
        v[i]=(1LL*(a) *v[i-1]+b)%c;
    maxim=getmax();
    j=1;

    for(exp=1;maxim/exp>0;exp*=10)
    {
        if(j%2==1)
            radix(v,output,exp);
        else
            radix(output,v,exp);
        j+=1;
    }
    if(j%2==1)
        afisare(v);
    else
        afisare(output);
    f.close();
    g.close();
    return 0;
}