본문 바로가기
Solved.ac/Class 3

[BOJ] 백준 1676번: 팩토리얼 0의 개수

by 강성주의 알고리즘 2020. 9. 7.

www.acmicpc.net/problem/1676

 

1676번: 팩토리얼 0의 개수

N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

N! 은 1x2x3x4 x... N으로 곱하는 과정에서 10의 배수가 생길 때마다 0이 생깁니다.

다시 해석해보면 N!을 곱하는 전체 과정을 소인수 분해하여 2와 5의 개수를 찾으면 맨뒤에 오는 연속된 0의 개수를 알 수 있습니다.

좀 더 간단화시키면 2의 배수는 5의 배수보다 항상 많으므로 N! 를 소인수 분해하여 5의 개수를 찾으면 됩니다.

5, 10, 15, 20, .... 은 5를 1개 가지고 있습니다.

25, 50, 75, .... 는 5를 2개 가지고 있습니다. 

125, 250, 375, .... 는 5를 3개 가지고 있습니다.

즉 주어진 수 N을 5로 나눈 몫 + 25로 나눈 몫 + 125로 나눈 몫 ... 을 더하면 전체 5의 개수를 구할 수 있고 그것이 답이 됩니다.

#include <algorithm>
#include <cstdio>
#include <vector>
#include <iostream>
#include <memory.h>
#include <math.h>

using namespace std;
int p[101],n;
int gp(int x) {
	return (p[x] == x ? x : p[x] = gp(p[x]));
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL), cout.tie(NULL);
	cin >> n;
	// 5의 개수, 25의 개수, 125의 개수, 625의 개수, ...
	int ans = 0;
	int f = 5;
	while ( n >= f) {
		ans += n / f;
		f *= 5;
	}
	cout << ans;
}
반응형