Pagini recente » Borderou de evaluare (job #1567006) | Cod sursa (job #1483461) | Borderou de evaluare (job #1761570) | Borderou de evaluare (job #1567680) | Cod sursa (job #2508481)
#include <bits/stdc++.h>
#define DMAX 10000010
using namespace std;
int numbers[2][DMAX];
int which;
int N, A, B, C;
void radixSort(int[][DMAX], int);
void sortByDigit(int[][DMAX], int, int);
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
int main()
{
fin >> N >> A >> B >> C;
numbers[0][0] = B % C;
for (int i = 1; i < N; i++)
{
numbers[0][i] = (1LL * A * numbers[0][i - 1] % C + B) % C;
cout << numbers[0][i] << ' ';
}
fin.close();
radixSort(numbers, N);
for (int i = 0; i < N; i+=10)
fout << numbers[which][i] << " ";
fout << "\n";
fout.close();
return 0;
}
void radixSort(int numbers[][DMAX], int n)
{
int maximus = numbers[which][0];
for (int i = 1; i < n; ++i)
maximus = max(numbers[which][i], maximus);
for (int p10 = 1; maximus / p10 > 0; p10 *= 10)
{
sortByDigit(numbers, n, p10);
which = 1 - which;
}
}
void sortByDigit(int numbers[][DMAX], int n, int p10)
{
int digits[10] = {0};
for (int i = 0; i < n; ++i)
++digits[numbers[which][i] / p10 % 10];
for (int i = 1; i < 10; ++i)
digits[i] += digits[i - 1];
for (int i = n - 1; i >= 0; --i)
numbers[1 - which][--digits[numbers[which][i] / p10 % 10]] = numbers[which][i];
}