U E D R , A S I H C RSS

Factorial Factors/1002

Approach

์ผ๋‹จ 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)

๋А๋‚€์ 

  • ํ˜น์‹œ๋‚˜ ํ•ด์„œ C++ ๋กœ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”๋ดค๋Š”๋ฐ (์ฝ”๋“œ ์˜ฎ๊ธฐ๋Š”๋ฐ 5๋ถ„) 100๋งŒ ๊ตฌํ•˜๋Š”๋ฐ๋Š” 12์ดˆ ์ •๋„ ์†Œ์š”.
    • ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์†๋„๋ฅผ ๋ณด๋‹ˆ Counter ๋ถ€๋ถ„์ด O(n^2) ์ด๋‹ค. caching ์„ ํ•จ์—๋„ ๊ทธ๋ ‡๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์–ธ๊ฐ€ ๋‹ค๋ฅธ ์ ‘๊ทผ๋ฒ•์ด ์žˆ์œผ๋ฆฌ๋ผ.
    • Python ์—์„œ O(n^2) ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ C++ ์—์„œ๋„ O(n^2) ์ด๋‹ค. -_-
      ๊ฒฐ๊ตญ์€ Python ์—์„œ 5์ดˆ ๋‚ด๋ฅผ ๋ฐŸ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“ค์–ด์•ผ C++ ๋กœ 1์ดˆ ์ด๋‚ด์˜ ์†๋„๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

  • ํ˜„ํƒœ๊บผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์†๋„ ๋ณด๊ณ  ์ขŒ์ ˆํ•˜๋‹ค. ๋‚ด๊ฐ€ ZP ๋ฅผ ๋– ๋‚  ๋•Œ๊ฐ€ ๋˜์—ˆ๊ตฌ๋‚˜.;;
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:15
Processing time 0.0037 sec