알고리즘문제풀이

13723 팩토리얼 분수 방정식

배우겠습니다 2024. 6. 15. 02:29

https://www.acmicpc.net/problem/13723

 

풀이

양의 정수 X,Y이므로 부호에 따른 조건과 정수꼴로 나타내지는 조건(특정한 수로 나누는 것과 같은 조건)이 필요함을 추측할 수 있다

1/N! = (X + Y)/XY

양변에 N!XY를 곱해주자 XY = N!(X+Y)

어떤 특정한 두 수를 곱하는 것으로 생각해볼 수도 있고 X와 Y의 관계로 나타내 볼 수 있다

후자가 더 쉬워보이므로 후자를 해본다

N!X + N!Y - XY = 0

N!X + Y(N!-X) = 0

N!X = Y(X-N!)

N!X/(X-N!) = Y

양의 정수만을 다루므로 해당 과정이 성립한다.

X > N!이므로 X를 N!+k으로 생각할 수 있다. (k는 양의 정수(

식을 정리해보자.

X = N! + k 라면 Y = N!(N!+k)/k 이다.

X는 어차피 양의정수고, Y를 정수로 만드는 k의 개수만 찾으면 된다.

Y = N!(N!+k)/k = (N!^2)/k + kN!/k = (N!^2)/k + N! = 정수

따라서 N!^2의 약수 개수를 찾으면 된다. 

약수의 개수는 소인수 분해를 통해 찾을 수 있다.

T = f1^p1 + f2^p2 + ... + fi^pi일때 약수의 개수는 (p1+1)(p2+1)...(pi+1)이다.

왜냐하면 0개를 선택하는 것 부터(1) 모든 소인수를 선택하는 것 까지(T) 개수를 세어야하기 때문이다.

N!^2을 소인수 분해하기 어렵다. 따라서 N!을 소인수 분해하자.

N!은 N(N-1)(N-2)...1 이고 a^x * a^y = a^(x+y) 이다.

따라서 1부터 N까지 각각의 수를 소인수 분해하고 그 결과들을 합쳐주면 된다.

소인수_테이블 = {}
for int i를 1부터 N:
	for int j를 1부터 sqrt(i):
    		while i % j == 0:
        		소인수_테이블[j] += 1
            		i = i / j

N!을 소인수 분해했다면 N!^2은?

(a^x)^2 = a^2x 이므로 테이블의 value를 2씩 곱해준다.

그리고 약수의 개수를 구하면 된다.

'알고리즘문제풀이' 카테고리의 다른 글

14705 홍삼 게임 (Hard)  (0) 2024.09.12
백준 7806 GCD!  (0) 2024.07.19
백준 1633 최고의 팀 만들기  (1) 2024.05.14
백준 11834 홀짝  (0) 2024.05.14
백준 31741 구간 덮기  (0) 2024.04.24