index

Resources:

https://rustp.org/basic-programs/input-single-number/

https://codeforces.com/blog/entry/111573

My template:

use std::io;
use std::collections::*;
use std::i32::{MIN, MAX};
 
pub fn take_usize() -> usize {
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
 
    return input.trim().parse().unwrap();
}
 
pub fn take_int() -> i32 {
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
 
    return input.trim().parse().unwrap();
}
 
pub fn take_vector_usize() -> Vec<usize> {
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    
    let arr:Vec<usize> = input
        .trim()
        .split_whitespace()
        .map(|x| x.parse().unwrap())
        .collect();
 
    return arr;
}
 
pub fn take_vector_int() -> Vec<i32> {
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
    
    let arr:Vec<i32> = input
        .trim()
        .split_whitespace()
        .map(|x| x.parse().unwrap())
        .collect();
 
    return arr;
}
 
pub fn take_string_as_vec() -> Vec<char>{
    let mut input = String::new();
    io::stdin().read_line(&mut input).unwrap();
 
    let arr:Vec<char> = input
        .trim()
        .chars()
        .collect();
 
    return arr;
}
 
pub fn vec_to_string(input:Vec<char>) -> String{
    return input.iter().collect::<String>();
}
 
pub fn cnt_digits(input:usize) -> usize{
    return ((input as f32).log10() as usize)+1;
}
 
pub fn reverse_num(mut input:usize) -> usize{
    let mut rev = 0;
    while input>0 {
        rev = rev*10 + input%10;
        input /= 10;
    }
    rev
}
 
pub fn gcd(mut a:usize, mut b:usize) -> usize{
    // Euclidean Algorithm
    while a>0 && b>0 {
        if a>b {
            a=a%b;
        }
        else {
            b=b%a;
        }
    }
    if a==0 {
        return b;
    }
    a
}
 
pub fn factors(input:usize) -> Vec<usize> {
    let mut factors1 = Vec::<usize>::new();
    let mut factors2 = Vec::<usize>::new();
    let mid = (input as f32).sqrt() as usize;
    
    for i in 1..(mid+1) {
        if input%i == 0{
            factors1.push(i);
            if i != input / i {
                factors2.insert(0,input / i);
            }
        }
    }
 
    factors1.append(&mut factors2);
    factors1
}
 
pub fn is_prime(input: usize) -> bool {
    if input <= 1 {
        return false;
    }
    if input == 2 {
        return true;
    }
    if input & 1 == 0 {
        return false;
    }
 
    let sqrt = (input as f64).sqrt() as usize;
    for i in (3..=sqrt).step_by(2) {
        if input % i == 0 {
            return false;
        }
    }
 
    true
}
 
pub fn factorial(input: usize) -> usize {
    (1..=input).product()
}
 
pub fn xor_upto(input: usize) -> usize {
    match input % 4 {
        0 => input,
        1 => 1,
        2 => input + 1,
        _ => 0,
    }
}
 
pub fn ncr(n: usize, r: usize) -> usize {
    let numerator: usize = ((n-r+1)..=n).product();
    let denominator: usize = (1..=r).product();
    return numerator / denominator
} 
 
// add binary search algorithms