Pagini recente » Cod sursa (job #3327779) | Cod sursa (job #616213) | Cod sursa (job #3336860) | Cod sursa (job #656837) | Cod sursa (job #3353998)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
const int MAXN = 10000005;
// Folosim int normal (32 biți -> 4 bytes).
// v ia 40 MB, temp ia 40 MB. Total 80 MB, perfect pentru limita de 128 MB.
int v[MAXN];
int temp[MAXN];
int cnt[256];
void radixsort(int n) {
// Un int pe 32 de biți are 4 secțiuni de 8 biți.
// shift = 0 (primii 8 biți), shift = 8 (următorii 8 biți), etc.
for (int shift = 0; shift < 32; shift += 8) {
// Resetăm vectorul de frecvență
for (int i = 0; i < 256; i++) {
cnt[i] = 0;
}
// 1. Numărăm de câte ori apare fiecare "cifră" în baza 256
// (v[i] >> shift) & 255 extrage exact secțiunea de 8 biți de care avem nevoie
for (int i = 1; i <= n; i++) {
int cifra = (v[i] >> shift) & 255;
cnt[cifra]++;
}
// 2. Transformăm frecvențele în poziții.
// cnt[i] va reține ultima poziție unde trebuie pus un element cu cifra 'i'
for (int i = 1; i < 256; i++) {
cnt[i] += cnt[i - 1];
}
// 3. Punem elementele la locul lor în vectorul temporar,
// mergând de la capăt spre început pentru a menține stabilitatea sortării.
for (int i = n; i >= 1; i--) {
int cifra = (v[i] >> shift) & 255;
temp[cnt[cifra]] = v[i];
cnt[cifra]--; // Scădem pentru a face loc următorului element cu aceeași cifră
}
// 4. Copiem elementele sortate înapoi în vectorul original
for (int i = 1; i <= n; i++) {
v[i] = temp[i];
}
}
}
int main() {
ios_base::sync_with_stdio(false);
fin.tie(NULL);
int n, a, b, c;
fin >> n >> a >> b >> c;
// Generăm vectorul conform formulei
v[1] = b;
for (int i = 2; i <= n; i++) {
v[i] = (1LL * a * v[i - 1] + b) % c; // 1LL e necesar aici ca să nu se piardă biți la înmulțire
}
radixsort(n);
// Afișăm din 10 în 10
for (int i = 1; i <= n; i += 10) {
fout << v[i] << " ";
}
return 0;
}