사용자 도구

사이트 도구


ps:problems:boj:4414

Factovisors

ps
링크acmicpc.net/…
출처BOJ
문제 번호4414
문제명Factovisors
레벨골드 4
분류

정수론

시간복잡도O(sqrt(m)) + O(t * (sqrt(m)/logm + logn))
인풋사이즈t<=?, n<=2^32, m<=2^32
사용한 언어Python 3.13
제출기록35560KB / 36ms
최고기록36ms
해결날짜2026/03/30

풀이

  • 르장드르 공식 (Legendre's formula)을 활용하면, n!을 나누는 m의 최대 지수를 구할 수 있다. 이 값이 0이면 m이 n!을 나누지 못하는 것이고, 1 이상이면 나눌 수 있는 것.
  • 이것을 계산하는 과정에서 m의 소인수분해가 필요한데, 미리 sqrt(m)까지의 소수 목록을 계산해 둔 뒤에, 소수들에 대해서만 나누기를 하는 방식으로 소인수분해를 수행하면, 여러 테스트 케이스에 대해서도 케이스당 O(sqrt(m)/logm) 에 소인수분해가 가능하다.
  • 다 합치면 총 시간복잡도는 O(sqrt(m)) + O(t * (sqrt(m)/logm + logn))
  • 매우 괴상한 에지 케이스가 있다. m이 0일 경우에는 '나누지 못한다'를 출력해야 한다
    • m이 0일때 '나눌수 없다'고 출력하는게 사실 맞는것인지도 의심이 간다. undefined behavior 인데, 저렇게 표현하는게 맞는 거긴 한가?

코드

"""Solution code for "BOJ 4414. Factovisors".

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

Tags: [number theory]
"""

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


@tio.run_until_eof
def main():
    primenum.prime_list(2**16)

    n, m = tio.read_ints()

    if m == 0:
        print(f'{m} does not divide {n}!')
        return

    e = numtheory.exponent_of_num_in_factorial(n, primenum.factorize(m))
    if e == 0:
        print(f'{m} does not divide {n}!')
    else:
        print(f'{m} divides {n}!')


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
W V D F L
 
ps/problems/boj/4414.txt · 마지막으로 수정됨: 2026/03/31 15:03 저자 teferi