Pagini recente » Cod sursa (job #832288) | Cod sursa (job #449017) | Cod sursa (job #905920) | Borderou de evaluare (job #1569420) | Cod sursa (job #2508394)
#include <iostream>
#include <stdio.h>
using namespace std;
int v[10000001], ma, n, aux[10000001];
void countSort(int ex)
{
int i;
int digits[10] = {0};
for(i = 0; i < n; i++)
digits[(v[i] / ex) % 10]++;
for(i = 1; i < 10 ; i++)
digits[i] += digits[i - 1];
for(i = n - 1; i >= 0; i--)
{
aux[digits[(v[i] / ex) % 10] - 1] = v[i];
digits[(v[i] / ex) % 10]--;
}
for(i = 0; i < n; i++)
v[i] = aux[i];
}
int main()
{
int a, b, c, i, w, z, ex;
freopen("radixsort.in", "r", stdin);
freopen("radixsort.out", "w", stdout);
scanf("%d%d%d%d",&n, &a, &b, &c);
w = v[0] = b;
int k = 1;
for(i = 1 ; i < n; i++)
{
z = (a *1LL* w + b) % c;
if(z > ma)
ma = z;
v[i] = z;
w = z;
//v[i] = (A * v[i-1] + B) % C
}
/*
ex = 1;
while(ma / ex > 0)
{
countSort(ex);
ex *= 10;
}
*/
ex = 8;
int pow = 255;
for(ex = 0; ex <= 24; ex+=8)
{
int digits[257] = {0};
if(ex != 0)
for(i = 0; i < n; i++)
{
v[i] = aux[i];
digits[ (v[i] >> ex) & pow ]++;
}
else
for(i = 0; i < n; i++)
{
digits[ (v[i] >> ex) & pow ]++;
}
for(i = 1; i < 256; i++)
digits[i] += digits[i - 1];
for(i = n-1; i >= 0; i--)
{
if(i == 9999820)
{
printf("");
z++;
}
aux[digits[ (v[i] >> ex) & pow ] - 1] = v[i];
digits[ (v[i] >> ex) & pow ]--;
}
// for(i = 0; i < n; i++)
// v[i] = aux[i];
}
for(i = 0 ; i < n ; i+= 10)
printf("%d ", aux[i]);
return 0;
}