実際調べてみたら、1e14までなら対象の数が数十個なので一旦数十個見つけ出してあとは入力範囲内にその数十個からあるだけ数えるでLarge input 1は解けました
が、Large input 2は対象の数が多すぎて1e100ってどうやって調べるかまったく見当もつかない状態でギブアップです
これも本番時はどうしてもIntとIntegerとFloatingの変換でうまく動かず
と言うか、動く以前にコンパイルすら通すことができず断念
予選Bといい、予選CといいHaskellってまったくいいところなしのクソクズ言語だなって思ってしまいましたが、翌日落ち着いて改めて取り組んでみたらサクサク進んだと言うかやっぱりいい言語なんじゃないかなと言ったところが最終的な結論でしょうか
1e100の入力はどうやってやるか不明のままです
--digitcp c = any (\i -> i == c) ['0'..'9']
pow base n = foldl (*) 1 (take n $ repeat base)
--rInt s = read (takeWhile digitcp s) :: Integer
rInt s = read s :: Integer
check lower upper = let lowersqrt = (ceiling . sqrt)
uppersqrt = (truncate . sqrt)
rr = [(lowersqrt (lower::Double))..(uppersqrt (upper::Double))]
tostr = map show
z arr = zip (tostr arr) ((map reverse . tostr) arr)
filterpalindrome arr = (map (rInt . fst) . filter (\(a, b) -> a == b) . z) arr
in
(map (rInt . fst) . filter (\(a, b) -> a == b) . z) (map (\x -> x * x) $ filterpalindrome rr)
--(length . filter (\(a, b) -> a == b) . z) (map (\x -> x * x) $ filterpalindrome rr)
start = check (pow 10 14) (pow 10 15)
st n = check (pow 10 n) (pow 10 (n + 1))
format n m = "Case #" ++ show n ++ ": " ++ show m
parserec _ [] = []
parserec n lines = let lower = (rInt . head . words . head) lines
upper = (rInt . last . words . head) lines
in
(format (n + 1) (check (fromIntegral lower) (fromIntegral upper))) : (parserec (n + 1) . tail) lines
parserec_large1 _ _ [] = []
parserec_large1 n res lines = let lower = (rInt . head . words . head) lines
upper = (rInt . last . words . head) lines
in
((format (n + 1) . length . filter (\i -> and [(i >= lower), (i <= upper)])) res) : (parserec_large1 (n + 1) res . tail) lines
parse lines = let t = (rInt . head) lines
in
(parserec 0 . tail) lines
parse_large1 lines = let t = (rInt . head) lines
res = check 1 (pow 10 14)
in
(parserec_large1 0 res . tail) lines
main = do cs <- getContents
(putStr . unlines . parse_large1 . lines) cs