AtCoder Beginner Contest 363 D

https://atcoder.jp/contests/abc363/tasks/abc363_d

桁数を指定すれば、その中で何番目の回文数は何かわかります。
オーバーフローの問題はi128を使えばよいです。

// Palindromic Number
#![allow(non_snake_case)]


//////////////////// library ////////////////////

fn read<T: std::str::FromStr>() -> T {
    let mut line = String::new();
    std::io::stdin().read_line(&mut line).ok();
    line.trim().parse().ok().unwrap()
}

// ex) 90 -> 09
fn reverse_number(mut n: i128) -> i128 {
    let mut m: i128 = 0;
    while n > 0 {
        let d = n % 10;
        m = m * 10 + d;
        n /= 10
    }
    m
}


//////////////////// process ////////////////////

fn num_of_palindromes(e: u32) -> i128 {
    if e == 0 {
        1
    }
    else {
        9 * 10_i128.pow((e-1)/2)
    }
}

fn nth_palindromes(n: i128, e: u32) -> i128 {
    if e == 0 {
        0
    }
    else if e % 2 == 0 {
        let m = n + 10_i128.pow(e/2-1);
        m * 10_i128.pow(e/2) + reverse_number(m)
    }
    else {
        let m = n + 10_i128.pow(e/2);
        m / 10 * 10_i128.pow(e/2+1) + reverse_number(m)
    }
}

fn F(mut N: i128) -> i128 {
    for e in 0.. {
        let np = num_of_palindromes(e);
        if np >= N {
            return nth_palindromes(N - 1, e)
        }
        N -= np
    }
    return 0
}

fn main() {
    let N: i128 = read();
    println!("{}", F(N))
}