Cod sursa(job #3301907)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 1 iulie 2025 02:32:07
Problema Multiplu Scor 100
Compilator rs Status done
Runda Arhiva de probleme Marime 2.08 kb
use std::fs::File;
use std::io::Write;
use std::io::{self, BufRead};

fn gcd(a: i32, b: i32) -> i32 {
    if b == 0 { a } else { gcd(b, a % b) }
}

fn lcm(a: i32, b: i32) -> i32 {
    (a * b) / gcd(a, b)
}

fn main() {
    let input = File::open("multiplu.in").expect("Unable to open file");
    let mut out = File::create("multiplu.out").expect("Unable to create file");

    let mut reader = io::BufReader::new(input);
    let mut line = String::new();
    reader.read_line(&mut line).expect("Unable to read line");

    let nums = line
        .trim()
        .split_whitespace()
        .map(|s| s.parse::<i32>().expect("Unable to parse number"))
        .collect::<Vec<i32>>();

    if nums.len() != 2 {
        panic!("Expected exactly two numbers");
    }

    let (a, b) = (nums[0], nums[1]);

    let m = lcm(a, b) as usize;
    let mut up = vec![0; m];
    let mut cif = vec![0; m];
    let mut coada = vec![];
    let mut in_coada: Vec<bool> = vec![false; m];

    coada.push(1);
    cif[0] = 1;
    up[0] = 0;
    in_coada[1] = true;

    let mut i = 0;

    while i < coada.len() {
        // println!("coada[i] = {}", coada[i]);
        let nr = (coada[i] * 10) % m;
        if !in_coada[nr as usize] {
            coada.push(nr);
            cif[coada.len() - 1] = 0;
            up[coada.len() - 1] = i;
            in_coada[nr as usize] = true;
            if nr == 0 {
                break;
            }
        }
        let nr = (coada[i] * 10 + 1) % m;
        if !in_coada[nr as usize] {
            coada.push(nr);
            cif[coada.len() - 1] = 1;
            up[coada.len() - 1] = i;
            in_coada[nr as usize] = true;
            if nr == 0 {
                break;
            }
        }
        i += 1;
    }

    let mut j = coada.len() - 1;
    let mut stack = vec![];
    while j > 0 {
        stack.push(cif[j]);
        j = up[j];
    }
    stack.push(cif[0]);
    stack.reverse();

    let result = stack
        .iter()
        .map(|&x| x.to_string())
        .collect::<Vec<String>>()
        .join("");

    writeln!(out, "{}", result).expect("Unable to write to file");
}