61 lines
1.2 KiB
Rust
61 lines
1.2 KiB
Rust
macro_rules! parse_line {
|
|
($t: ty) => ({
|
|
let mut line = String::new();
|
|
std::io::stdin().read_line(&mut line).unwrap();
|
|
line.trim().parse::<$t>().unwrap()
|
|
})
|
|
}
|
|
|
|
fn length(n: u32) -> u32{
|
|
n.to_string().len() as u32
|
|
}
|
|
|
|
fn biggest_generated(len : u32) -> u32{
|
|
10u32.pow(len) + 9 * len - 1
|
|
}
|
|
|
|
fn coeff(len : u32) -> u32{
|
|
10u32.pow(len - 1) + 1
|
|
}
|
|
|
|
fn min_div_sum(n: u32, len : u32) -> Option<u32>{
|
|
if len == 1 {
|
|
match n % 2 {
|
|
0 => return Some(n / 2),
|
|
_ => return None
|
|
}
|
|
}
|
|
|
|
let c = coeff(len);
|
|
let x = match n.checked_sub(biggest_generated(len - 1)){
|
|
Some(y) => y,
|
|
None => 0,
|
|
};
|
|
let mut start = match x % c {
|
|
0 => x,
|
|
m => x + (c - m),
|
|
};
|
|
|
|
|
|
while start <= n {
|
|
let a = start / c;
|
|
match min_div_sum(n - start, len - 1){
|
|
Some(m) => return Some(a * 10u32.pow(len - 1) + m),
|
|
_ => (),
|
|
}
|
|
|
|
start += c;
|
|
}
|
|
|
|
return None;
|
|
}
|
|
|
|
fn main(){
|
|
let n = parse_line!(u32);
|
|
let len = length(n);
|
|
match min_div_sum(n, len){
|
|
Some(i) => {println!("{}", i);},
|
|
None => {println!("0");},
|
|
}
|
|
}
|