n!은 매우 큰 숫자기 때문에 long long 형의 범위도 가볍게 넘어버린다.
그러나 k가 int 형 범위이기 때문에 결과는 최대 공약수가 나와서 big integer를 구현할 필요는 없다.
이 문제를 풀기 위해선 k를 소인수 분해할 필요가 있다.
k를 소인수 분해 하는것은 소수판별 할 때 처럼, 2부터 root(k)까지만 검사하면 된다.
푸는 방법을 의사 코드로 나타내 보았다.
s = 1; for(i = 1; i <= sqrt(k); i++) { p = 0; while(k % i == 0) { b /= i; p++; } if (p) { // n!에서 인수 i가 몇개 존재하는가 k = primeFactorCountOfFactotial(n,i); s *= pow(i,k); } } print s;
primeFactorCountOfFactorial(n,i) { result = 0; for(j = i; j <= n; j *= i) { result += (int)(n / j); } return result; }소스
댓글 없음:
댓글 쓰기