Pagini recente » Cod sursa (job #1470846) | Cod sursa (job #2444802) | Cod sursa (job #2567555) | Cod sursa (job #2581258) | Cod sursa (job #2574361)
#include <bits/stdc++.h>
using namespace std;
ifstream f("radixsort.in");
ofstream g("radixsort.out");
int v[10000005];
int n, a, b, c;
#define TOTAL_BYTES sizeof(v[0])
#define RADIX 0xFF
#define RADIX_SIZE 8
#define get_byte(x) (x >> (8 * byte) & RADIX)
void Read()
{
f>>n>>a>>b>>c;
f.close();
}
void Solve()
{
v[0] = b % c;
for(int i = 1;i < n;++i)
v[i] = ((1LL * a * v[i - 1]) % c + b) % c;
}
void CountSort(int A[], int B[], 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(A[i])];
index[0] = 0;
for(int i = 1;i < 1 << RADIX_SIZE;++i)
index[i] = index[i - 1] + counter[i - 1];
for(int i = 0;i < n;++i)
B[index[get_byte(A[i])]++] = A[i];
}
void RadixSort()
{
int *tmp = new int[n];
for(int i = 0;i < TOTAL_BYTES;++i)
if(i % 2 == 0)
CountSort(v, tmp, i);
else
CountSort(tmp, v, i);
}
int main()
{
Read();
Solve();
RadixSort();
for(int i = 0;i < n;i += 10)
g<<v[i]<<" ";
g.close();
return 0;
}