Pagini recente » Cod sursa (job #2520531) | Cod sursa (job #1875279) | Cod sursa (job #1092767) | Cod sursa (job #948544) | Cod sursa (job #1889235)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <algorithm>
#include <cassert>
using namespace std;
vector<int> sol;
int N, A, B, C, X;
struct MyNum {
int val;
int rval;
};
vector<MyNum> v;
vector<MyNum> b[2][1000];
void radix() {
bool done = false;
int src = 0, dst = 1;
for (int i = 0; i < v.size(); ++i) {
X = v[i].val;
b[src][X % 1000].push_back({X / 1000, X});
}
while (!done) {
done = true;
for (int i = 0; i < 1000; ++i) {
for (int j = 0; j < b[src][i].size(); ++j) {
X = b[src][i][j].val;
if (X == 0) {
sol.push_back(b[src][i][j].rval);
} else {
b[dst][X % 1000].push_back({X / 1000, b[src][i][j].rval});
done = false;
}
}
}
src ^= 1;
dst ^= 1;
}
}
int main() {
freopen("radixsort.in","r",stdin);
freopen("radixsort.out","w",stdout);
cin >> N >> A >> B >> C;
//N = 100; A = 12; B = 38; C = 123;
v.push_back({B,B});
X = B;
for (int i = 1; i < N; ++i) {
X = ((long long)A * X + B) % C;
v.push_back({X, X});
}
radix();
for (int i = 0; i < sol.size(); ++i) {
if (i % 10 == 0) {
printf("%d ", sol[i]);
}
}
return 0;
}