Cod sursa(job #2474247)

Utilizator Rufus007Marincia Catalin Rufus007 Data 14 octombrie 2019 21:40:23
Problema Fractii Scor 50
Compilator rs Status done
Runda Arhiva de probleme Marime 1.08 kb
use std::fs::File;
use std::io::{BufReader, BufRead, BufWriter, Write};

fn fractii(n: i64) -> i64 {
    let mut prim: [i64; 100004] = [0; 100004];

    for i in 1..=n {
        prim[i as usize] = i - 1;
    }
    let mut sol: i64 = 0;
    for i in 2..=n {
        sol += prim[i as usize];

        let mut j = i + i;
        while j <= n {
            prim[j as usize] -= prim[i as usize];
            j += i;
        }
    }
    sol * 2 + 1
}

fn read(path: &str) -> impl Iterator<Item=i64> {
    let br = BufReader::new(File::open(path)
        .expect(&format!("Couldn't open {} file", path)));

    br.lines()
        .map(|line| line.expect("couldn't read line"))
        .flat_map(|line| {
            line.split_whitespace()
                .map(|num| num.parse().expect("not a number"))
                .collect::<Vec<i64>>()
        })
}

fn main() {
    let mut iter = read("fractii.in");
    let mut bw = BufWriter::new(File::create("fractii.out")
        .expect(&format!("Couldn't create output file")));
    if let Some(number) = iter.next() {
        write!(bw, "{}", fractii(number));
    }
}