사용자 도구

사이트 도구


ps:problems:boj:3964

팩토리얼과 거듭제곱

ps
링크acmicpc.net/…
출처BOJ
문제 번호3964
문제명팩토리얼과 거듭제곱
레벨골드 2
분류

정수론

시간복잡도O(sqrt(m)) + O(T * (sqrt(m)/logm + logn))
인풋사이즈T<=100, n<=10^18, m<=10^12
사용한 언어Python 3.13
제출기록41448KB / 188ms
최고기록72ms
해결날짜2026/03/31

풀이

  • n!을 나누는 m의 최대 지수는 르장드르 공식 (Legendre's formula)을 활용해서 쉽게 구할 수 있다
  • 이것을 계산하는 과정에서 m의 소인수분해가 필요한데, 미리 sqrt(m)까지의 소수 목록을 계산해 둔 뒤에, 소수들에 대해서만 나누기를 하는 방식으로 소인수분해를 수행하면, 여러 테스트 케이스에 대해서도 케이스당 O(sqrt(m)/logm) 에 소인수분해가 가능하다.
  • 다 합치면 총 시간복잡도는 O(sqrt(m)) + O(t * (sqrt(m)/logm + logn))

코드

"""Solution code for "BOJ 3964. 팩토리얼과 거듭제곱".

- Problem link: https://www.acmicpc.net/problem/3964
- Solution link: http://www.teferi.net/ps/problems/boj/3964

Tags: [number theory]
"""

from teflib import io as tio
from teflib import numtheory
from teflib import primenum


@tio.run_n_times
def main():
    primenum.prime_list(10**6)

    n, k = tio.read_ints()
    print(numtheory.exponent_of_num_in_factorial(n, primenum.factorize(k)))


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
F V X B C
 
ps/problems/boj/3964.txt · 마지막으로 수정됨: 2026/03/31 15:22 저자 teferi