Skip to content

Instantly share code, notes, and snippets.

@t-uda
Last active December 18, 2015 17:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save t-uda/5822869 to your computer and use it in GitHub Desktop.
Save t-uda/5822869 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
$memo = [1]
JUMAN = 100000
def removeZeros(x)
while (x % 10 == 0) do
x /= 10
end
return x
end
def f(n)
return $memo[n] if (n < $memo.length)
if (n < JUMAN) then
x = 1
1.upto(n) do |i|
x *= i
x = removeZeros(x)
x %= JUMAN
$memo[i] = x
end
return x
elsif (n >= JUMAN) then
m = (n / JUMAN).to_i
n %= JUMAN
x = f(JUMAN - 1) # equals to f(JUMAN), by definition.
x = g(x, m) # equals to (removeZeros(x ** m) % JUMAN).
x *= f(n)
return removeZeros(x) % JUMAN
end
end
def g(x, m)
# g(x, m) should calculate (removeZeros(x ** m) % JUMAN).
if (m == 0) then
return 1
elsif (m % 2 == 1) then
return removeZeros(x * (g(x, (m - 1) / 2) ** 2)) % JUMAN
else
return removeZeros(g(x, m / 2) ** 2) % JUMAN
end
end