Pagini recente » Cod sursa (job #3302285) | Cod sursa (job #3315341) | Cod sursa (job #3313044) | Cod sursa (job #3315347) | Cod sursa (job #3313644)
use std::{fs::File, io::BufWriter, vec};
#[allow(unused_imports)]
use std::io::{BufRead, BufReader, Read, Write};
const FILE: &'static str = "radixsort";
const PATTERN1: usize = 0x0000FFFF;
const PATTERN2: usize = 0xFFFF0000;
const BASE: usize = 0x10000;
const BASE_DIGITS: usize = 16;
fn main() {
let mut fin = BufReader::new(File::open(format!("{}.in", FILE)).unwrap());
let mut fout = BufWriter::new(File::create(format!("{}.out", FILE)).unwrap());
let mut input = String::new();
fin.read_line(&mut input).unwrap();
let [n, a, b, c] = input.trim().split_ascii_whitespace().map(|x| x.parse::<usize>().unwrap()).collect::<Vec<usize>>()[..] else {
panic!("Incorrect input shape");
};
let a = a as usize;
let b = b as usize;
let c = c as usize;
let mut v = vec![0_usize; n];
v[0] = b;
for i in 1..n {
v[i] = (a * v[i - 1] + b) % c;
}
let mut cat1 = vec![0_usize; BASE];
let mut cat2 = vec![0_usize; BASE];
for x in v.iter() {
cat1[(x & PATTERN1) as usize] += 1;
cat2[((x & PATTERN2) >> BASE_DIGITS) as usize] += 1;
}
for i in 1..BASE {
cat1[i] += cat1[i - 1];
cat2[i] += cat2[i - 1];
}
for i in (1..BASE).rev() {
cat1[i] = cat1[i - 1];
cat2[i] = cat2[i - 1];
}
cat1[0] = 0;
cat2[0] = 0;
let mut v2 = vec![0_usize; n];
let mut cnt = vec![0_usize; BASE];
for x in v {
v2[cat1[x & PATTERN1] + cnt[x & PATTERN1]] = x;
cnt[x & PATTERN1] += 1;
}
let v = v2;
let mut v2 = vec![0_usize; n];
let mut cnt = vec![0_usize; BASE];
for x in v {
v2[cat2[(x & PATTERN2) >> BASE_DIGITS] + cnt[(x & PATTERN2) >> BASE_DIGITS]] = x;
cnt[(x & PATTERN2) >> BASE_DIGITS] += 1;
}
let v = v2;
for i in (0..n).step_by(10) {
write!(&mut fout, "{} ", v[i]).unwrap();
}
}