Pagini recente » Cod sursa (job #2849972) | Cod sursa (job #2731189) | Cod sursa (job #2841907) | Cod sursa (job #2819519) | Cod sursa (job #2506048)
#include <fstream>
#include <cstring>
#define NMAX 10000005
using namespace std;
ifstream in("radixsort.in");
ofstream out("radixsort.out");
int N, A, B, C, v[NMAX], output[NMAX];
int Get_Max()
{
int maxim = 0;
for(int i = 1; i <= N; i++)
maxim = max(maxim, v[i]);
return maxim;
}
int Count_Digits(int n)
{
int digit = 1;
while(n/=10) digit++;
return digit;
}
void Read_Data()
{
in >> N >> A >> B >> C;
v[1] = B;
for(int i = 2; i <= N; i++)
v[i] = ((long long)((A * v[i - 1] % C + B) % C));
}
void Counting_Sort(int digit)
{
int ten_factor = 1, c_digit = digit, ccnt[10];
while(--c_digit) ten_factor *= 10;
memset(ccnt, 0, sizeof ccnt);
for(int i = 1; i <= N; i++)
{
int new_number = (v[i] / ten_factor) % 10;
ccnt[new_number]++;
}
for(int i = 1; i < 10; i++)
ccnt[i] = ccnt[i] + ccnt[i - 1];
for(int i = N; i >= 1; i--)
{
int new_number = (v[i] / ten_factor) % 10;
output[ccnt[new_number]] = v[i];
ccnt[new_number]--;
}
for(int i = 1; i <= N; i++)
v[i] = output[i];
}
void Radix_Sort()
{
int max_number = Get_Max();
int max_digits = Count_Digits(max_number);
for(int i = 1; i <= max_digits; i++)
Counting_Sort(i);
}
void Print_Sol()
{
for(int i = 1; i <= N; i+=10)
out << v[i] << " ";
out << "\n";
}
int main()
{
Read_Data();
Radix_Sort();
Print_Sol();
return 0;
}