Pagini recente » Cod sursa (job #899492) | Cod sursa (job #871466) | Cod sursa (job #2719693) | Cod sursa (job #901657) | Cod sursa (job #2041926)
#include <fstream>
#define in "radixsort.in"
#define out "radixsort.out"
#define N 10000003
#define NR_BITI 30
using namespace std;
ifstream fin(in);
ofstream fout(out);
struct nod
{
nod *urm;
int info;
}*p[2],*u[2];
int v[N];
int n,A,B,C;
void init()
{
fin>>n>>A>>B>>C;
v[1] = B;
for(int i=2; i<=n; ++i)
v[i] = ((long long)A * v[i-1] + B)%C;
}
inline void add_nod(const int &val,const bool &b)
{
nod *c = new nod;
c->info = val;
c->urm = NULL;
if(p[b] == NULL)
p[b] = u[b] = c;
else
{
u[b]->urm = c;
u[b]= c;
}
}
void radix()
{
for(int b=0; b<NR_BITI; ++b)
{
for(int i=1; i<=n; ++i)
add_nod(v[i],(v[i]>>b)%2); //daca bitul b+1 este 1, este adaugat in lista p[1]
// altfel bitul este 0, deci este adaugat in lista p[0]
nod *c = p[0],*q;
int k = 0;
while(c != NULL)
{
v[++k] = c->info;
q = c;
c = c->urm;
delete q;
}
c = p[1];
while(c != NULL)
{
v[++k] = c->info;
q = c;
c = c->urm;
delete q;
}
p[0] = p[1] = NULL;
}
}
void afis()
{
for(int i=1; i<=n; i+=10)
fout<<v[i]<<" ";
}
int main()
{
init();
radix();
afis();
fin.close();
fout.close();
return 0;
}