Cod sursa(job #1295513)
Utilizator | Data | 19 decembrie 2014 18:08:27 | |
---|---|---|---|
Problema | Radix Sort | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.64 kb |
#include <iostream>
#include <fstream>
using namespace std;
fstream in("radixsort.in",ios::in);
fstream out("radixsort.out",ios::out);
struct nod
{
int info;
nod *next;
};
int main()
{
unsigned long a[1000000],i,N,A,B,C,div=1,j,x,max,div1=1;
nod v[15],*p,*q[15],*z;
in>>N>>A>>B>>C;
in.close();
a[1]=B;
max=a[1];
for(i=2;i<=N;i++)
{
a[i]=(A*a[i-1]+B)%C;
if(a[i]>max)
max=a[i];
}
while(max>0)
{
div1=div1*10;
max=max/10;
}
do{
for(i=0;i<10;i++)
{
v[i].next=0;
q[i]=&v[i];
}
for(j=1;j<=N;j++)
{
x=a[j];
x=x/div;
x=x%10;
p=new nod;
p->info=a[j];
q[x]->next=p;
p->next=0;
q[x]=p;
}
j=1;
for(i=0;i<10;i++)
{
p=v[i].next;
while(p!=0)
{
a[j++]=p->info;
p=p->next;
}
}
for(i=0;i<10;i++)
{
if(v[i].next!=0)
{
z=v[i].next;
if(z->next!=0)
p=z->next;
}
if(z!=0)
while(z!=0)
{
delete z;
z=p;
if(p!=0)
p=p->next;
}
}
div=div*10;
}while(div<div1);
for(i=1;i<=N;i=i+10)
out<<a[i]<<" ";
out.close();
return 0;
}