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)) }