Pagini recente » Cod sursa (job #27913) | Cod sursa (job #2814251) | Cod sursa (job #1376367) | Cod sursa (job #2587003) | Cod sursa (job #1380275)
#include <fstream>
#define nmax 10000001
#include <cstring>
#define TOTAL_BYTES sizeof(numbers[0])
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int numbers[nmax];
int n;
#define RADIX 0xFF
#define get_byte(x) ((x>>(byte * 8))&RADIX)
void read(){
int a,b,c;
fin>>n>>a>>b>>c;
numbers[0] = b%c;
for(int i = 1;i < n;i++)
numbers[i] = (1LL*a*numbers[i-1]%c + b)%c;
}
void countersort(int A[],int B[],int byte){
int counter[1<<8];
int index[1<<8];
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<<8;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 *temp = new int[n];
for(int i = 0;i < TOTAL_BYTES;i++){
if(i%2 == 0)
countersort(numbers,temp,i);
else
countersort(temp,numbers,i);
}
}
void print(){
for(int i = 0;i < n;i += 10)
fout<<numbers[i]<<' ';
fout<<"\n";
}
int main(){
read();
radixsort();
print();
return 0;
}