ABC044D - 桁和
問題
https://atcoder.jp/contests/abc044/tasks/arc060_b
回答
defmodule Main do
def main do
:stdio
|> IO.read(:all)
|> solve()
|> IO.puts()
end
defp split_lines(lines) do
lines
|> String.trim()
|> String.split("\n")
end
defp digsum(b, n) when n < b, do: n
defp digsum(b, n), do: rem(n, b) + digsum(b, div(n, b))
def solve(input) do
[n, s] =
input
|> split_lines()
|> Enum.map(&String.to_integer/1)
cond do
n == s ->
n + 1
n < s ->
-1
true ->
{small, big} =
for i <- 1..(:math.sqrt(n - s) |> ceil() |> Kernel.+(1)),
rem(n - s, i) == 0 do
{i, div(n - s, i)}
end
|> Enum.reduce({[], []}, fn {small_i, big_i}, {small_acc, big_acc} ->
{[small_i | small_acc], [big_i | big_acc]}
end)
[Enum.reverse(small), big]
|> List.flatten()
|> Enum.find(-2, &(digsum(&1 + 1, n) == s))
|> Kernel.+(1)
end
end
end
"""
87654
30
"""
|> Main.solve()
|> then(&(&1 == 10))
"""
87654
138
"""
|> Main.solve()
|> then(&(&1 == 100))
"""
87654
45678
"""
|> Main.solve()
|> then(&(&1 == -1))
"""
31415926535
1
"""
|> Main.solve()
|> then(&(&1 == 31_415_926_535))
"""
1
31415926535
"""
|> Main.solve()
|> then(&(&1 == -1))