일단 Factorial 이라는 점에서 해당 계산에 대해 다음과 같은 식을 만들어냄.
F(n) = Count(n) + F(n-1)
Count(n) = 해당 n 에 대한 인수항 총합
그리고 F, Count 들에 대해서 caching 을 진행할 수 있으리라 생각, 다음과 같이 풀음.
~cpp
class Counter:
def __init__(self):
self._cache=[None] * 1000000
def __call__(self,n):
return self.count(n)
def count(self,n,start=0):
value = self._cache[n]
if value != None: return value+start
half = n/2
for e in xrange(2,half+1):
if n % e ==0:
result = self.count(n/e,start+1)
self._cache[n] = result
return result
result = start+1
self._cache[n] = result
return result
CountFunc = Counter()
def factorialFactor(n):
total = sum((CountFunc(i) for i in xrange(2,n+1)))
return total
def main():
for i in [2,5,8,1996,123456,1000000]: print factorialFactor(i)