※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2553번 문제인 마지막 팩토리얼 수이다.
문제는 아래 링크를 확인하자.

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

 

2553번: 마지막 팩토리얼 수

첫째 줄에 N이 주어진다. N은 20,000보다 작거나 같은 자연수 이다.

www.acmicpc.net

N이 많은 5를 인수로 갖고 있다면 (N-1)!에 N을 곱해 N!을 구할 때 N의 5의 인수개수만큼 다음 팩토리얼값에는 0이 늘어나게 된다. (2의 인수 개수가 항상 더 많다는 점을 관찰하자.)

 

20000 이하에서 자연수가 인수로 가질 수 있는 5의 개수의 최댓값은 6이다. 따라서 주어지는 수의 마지막 12자리만을 저장한다면 문제를 간단히 해결할 수 있다. 64비트 정수 자료형을 이용한다면 오버플로우 없이 계산 과정의 모든 연산들을 해낼 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long long ll;

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	ll ans = 1;
	ll N; cin >> N;
	for (ll i = 1; i <= N; i++) {
		ans *= i;
		while (ans % 10 == 0) ans /= 10;
		ans %= 1000000000000LL;
	}

	cout << ans % 10;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 24855 // C++] Natives  (0) 2022.08.28
[BOJ 14649 // C++] 문홍안  (0) 2022.08.28
[BOJ 14645 // C++] 와이버스 부릉부릉  (0) 2022.08.28
[BOJ 6970 // C++] Sentences  (0) 2022.08.28
[BOJ 14646 // C++] 욱제는 결정장애야!!  (0) 2022.08.28

+ Recent posts