実際調べてみたら、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