Pagini recente » Cod sursa (job #140892) | Cod sursa (job #2855263) | Cod sursa (job #530190) | Cod sursa (job #2139066) | Cod sursa (job #1379259)
#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 get_byte(x) ((x>>(byte*8))&0xFF)
//void read();
//void countersort(int*&,int*&,int);
//void radixsort();
//void print();
void read(){
//scanf("%d %d %d %d ",&n,&a,&b,&c);
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)//printf("%d ",numbers[i]);
fout<<numbers[i]<<" ";
fout<<"\n";
//printf("\n");
}
int main(){
//freopen("apm.in","r",stdin);
//freopen("apm.out","w",stdout);
read();
radixsort();
print();
return 0;
}