Pagini recente » Cod sursa (job #1846190) | Cod sursa (job #1483270) | Cod sursa (job #1866365) | Cod sursa (job #529726) | Cod sursa (job #2589450)
#define NMAX 10000005
#include <cstdio>
#include <fstream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int n, a, b, c;
int v[NMAX], aux[NMAX];
ifstream f("radixsort.in");
ofstream g("radixsort.out");
int TOTAL_BYTES;
///#define TOTAL_BYTES sizeof(v[0])
#define RADIX 0xFF
#define RADIX_SIZE 8
#define get_byte(x) (x>>(8*byte) & RADIX)
void formv()
{
v[0] = b%c;
for(int i = 1; i < n; ++i)
{
int val = ((1LL*v[i-1]*a)%c + b)%c;
v[i] = val;
}
}
void afis(int step)
{
for(int i = 0; i < n; i += step)
g<<v[i]<<" ";
}
void countSort(int v[], int aux[], int byte)
{
int counter[1 << RADIX_SIZE];
int index[1 << RADIX_SIZE];
memset(counter, 0, sizeof(counter));
for(int i = 0; i < n; ++i)
++counter[get_byte(v[i])];
for(int i = 1; i < 1<<RADIX_SIZE; ++i)
counter[i] += counter[i-1];
for(int i = n-1; i >= 0; --i)
{
aux[counter[get_byte(v[i])]] = v[i];
counter[get_byte(v[i])]--;
}
}
void radix()
{
TOTAL_BYTES = sizeof(v[0]);
for(int i = 0; i < TOTAL_BYTES; ++i)
if(i%2 == 0)
countSort(v, aux, i);
else countSort(aux, v, i);
}
void read()
{
f>>n>>a>>b>>c;
formv();
}
int main()
{
read();
radix();
afis(10);
return 0;
}