https://atcoder.jp/contests/abc428/tasks/abc428_d
yの桁数を決めれば整数の範囲が決まるので、平方根のfloorを求められればその範囲の平方数の個数が求められます。
// 183184 #![allow(non_snake_case)] use std::cmp::{min, max}; //////////////////// 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() } fn read_vec<T: std::str::FromStr>() -> Vec<T> { read::<String>().split_whitespace() .map(|e| e.parse().ok().unwrap()).collect() } fn int_sqrt(n: i64) -> i64 { let mut x = (n + 1) / 2; loop { let x1 = (x + n / x) / 2; if x1 >= x { return x } x = x1 } } //////////////////// process //////////////////// fn read_test() -> (i64, i64) { let v: Vec<i64> = read_vec(); let (C, D) = (v[0], v[1]); (C, D) } fn F_each(C: i64, D: i64) -> i64 { let mut counter: i64 = 0; let mut p: i64 = 1; loop { p *= 10; if C+D < p/10 { break } if C+1 > p { continue } let first = C*p + max(C+1, p/10); let last = C*p + min(C+D+1, p); counter += int_sqrt(last - 1) - int_sqrt(first - 1) } counter } fn F(T: usize) { for _ in 0..T { let (C, D) = read_test(); println!("{}", F_each(C, D)) } } fn main() { let T: usize = read(); F(T) }