반응형
<코드>
#include<iostream>
using namespace std;
int length, cnt = 0;
long long DP[501][2];
unsigned long long factorial(int x)
{
if (x == 0) return 1;
else return x * factorial(x - 1);
}
int main()
{
cin >> length;
DP[0][0] = 1;
DP[0][1] = 0;
for (int i = 1; i <= length; i++)
{
DP[i][0] = DP[i - 1][0] * i;
while (DP[i][0] % 10 == 0)
{
DP[i][0] /= 10;
cnt++;
}
DP[i][0] %= 1000;
DP[i][1] = cnt;
}
cout << cnt;
}
long long형임에도 불구하고 20! 이후에는 숫자가 무진장 커져서 문제 조건에서 N이 0부터 500까지임을 보고 DP로 풀어야겠다고 생각하였다.
풀이법은 간단하게 각 DP에서 맨 뒤의 0을 없애주고 count 해서 0의 개수를 세었고 남은 부분에서 1000을 또 나눠줘서 숫자가 자료형의 범위를 넘지 않도록 하였다.
<숏코드>
#include<iostream>
using namespace std;
int N;
int cnt2 = 0, cnt5 = 0;
int main()
{
cin >> N;
for (int i = 2; i <= N; i *= 2) cnt2 += N / i;
for (int i = 5; i <= N; i *= 5) cnt5 += N / i;
cout << ((cnt2 < cnt5) ? cnt2 : cnt5);
}
DP풀이법 이외에 다른사람들의 코드를 찾아봤는데 맨 뒤의 0의 자리를 찾으려면 10의 약수인 2와 5의 개수를 센 후 그중에서 더 작은 개수만큼 2x5의 쌍이 만들어지므로 위와같은 풀이가 가능하다.
반응형
'🧩PS > 🥈Nomal' 카테고리의 다른 글
[C/C++] 백준 10828번 - 스택 (0) | 2020.12.06 |
---|---|
[C/C++] 백준 2004번 - 조합 0의 개수 (0) | 2020.12.06 |
[C/C++] 백준 9375번 - 패션왕 신해빈 (3) | 2020.12.05 |
[C/C++] 백준 11051번 - 이항 계수 2 (DP풀이) (0) | 2020.12.03 |
[C/C++] 백준 3036번 - 링 (0) | 2020.12.03 |