{"data":{"site":{"siteMetadata":{"title":"HOME | blackpudding","subtitle":"고생했어. 오늘도.","copyright":"© All rights reserved.","author":{"name":"William JO","github":"blackpudding96"},"disqusShortname":"blackpudding","url":"https://blackpudding.netlify.com"}},"markdownRemark":{"id":"ceac40c9-f61a-59d7-a96d-75d7618585cd","html":"<h1>1676번 : 팩토리얼 0의 개수</h1>\n<p>👉 <a href=\"https://www.acmicpc.net/problem/1676\">문제 바로가기</a></p>\n<h2>배경 지식</h2>\n<ul>\n<li><code class=\"language-text\">소수(Prime Number)</code> : 자신보다 작은 두 개의 자연수를 곱하여 만들 수 없는 1보다 큰 자연수; 1과 자신 이외의 자연수로 나눌 수 없는 자연수</li>\n<li><code class=\"language-text\">소인수(Prime Factor)</code> : 소수인 인수(약수)</li>\n<li><code class=\"language-text\">소인수분해</code> : 합성수를 소수의 곱으로 나타내는 방법; 소인수를 구하는 것</li>\n</ul>\n<h2>푼 방법</h2>\n<p>보기엔 팩토리얼 관련 문제처럼 보이지만, 팩토리얼 알고리즘으로는 절대 풀 수 없는 문제이다. 30!만 계산해보아도 30! = 265,252,859,812,191,058,636,308,480,000,000으로 unsigned __int64의 최대범위를 훌쩍 넘겨버린다.</p>\n<p>그럼 어떻게 풀어야할까? 우선 문제를 보면 우리가 구해야 할 것은 <strong>n! 결과값 맨 뒤에서 연속되는 0의 수</strong>이다. 그러면 <strong>뒷자리가 0이 되는 규칙</strong>만 찾으면 굳이 n!을 구할 필요가 없다.</p>\n<p>다음의 식들을 살펴보자.</p>\n<ul>\n<li>10 = 2 x 5</li>\n<li>100 = 2 x 2 x 5 x 5</li>\n<li>1000 = 2 x 2 x 2 x 5 x 5 x 5</li>\n</ul>\n<p>위 식에서 보면 <strong>뒷자리 0의 개수 = 소인수 2와 5의 쌍의 개수</strong>임을 알 수 있다. 그러므로 우리는 <strong>n!의 소인수 2와 5의 쌍의 개수</strong>를 찾아 주면 된다.</p>\n<hr>\n<p>&#x3C;추가 내용></p>\n<p>위 알고리즘은 1억 이상의 수가 들어오면 time out이 뜬다.</p>\n<p>소인수 2의 개수보다 소인수 5의 개수는 항상 작으므로 5의 개수만 구해주어도 된다.</p>\n<h2>내 정답 코드 (C++)</h2>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre class=\"language-c\"><code class=\"language-c\"><span class=\"token macro property\">#<span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">get_min</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> a<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> b<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t<span class=\"token keyword\">return</span> a <span class=\"token operator\">></span> b <span class=\"token operator\">?</span> b <span class=\"token punctuation\">:</span> a<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>ios<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">sync_with_stdio</span><span class=\"token punctuation\">(</span>false<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cin<span class=\"token punctuation\">.</span><span class=\"token function\">tie</span><span class=\"token punctuation\">(</span><span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> \n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout<span class=\"token punctuation\">.</span><span class=\"token function\">tie</span><span class=\"token punctuation\">(</span><span class=\"token constant\">NULL</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">int</span> n<span class=\"token punctuation\">,</span> n_2 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> n_5 <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cin <span class=\"token operator\">>></span> n<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token comment\">// n/5 + n/5^2 ... 더 효율적!</span>\n\t<span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;=</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">int</span> num <span class=\"token operator\">=</span> i<span class=\"token punctuation\">;</span>\n\t\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">%</span> <span class=\"token number\">2</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token operator\">++</span>n_2<span class=\"token punctuation\">;</span>\n\t\t\t\tnum <span class=\"token operator\">/</span><span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\t\n\t\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">%</span> <span class=\"token number\">5</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>num <span class=\"token operator\">%</span> <span class=\"token number\">5</span> <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\t\t\t\t<span class=\"token operator\">++</span>n_5<span class=\"token punctuation\">;</span>\n\t\t\t\tnum <span class=\"token operator\">/</span><span class=\"token operator\">=</span> <span class=\"token number\">5</span><span class=\"token punctuation\">;</span>\n\t\t\t<span class=\"token punctuation\">}</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token punctuation\">}</span>\n\t\n\tstd<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token function\">get_min</span><span class=\"token punctuation\">(</span>n_2<span class=\"token punctuation\">,</span> n_5<span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;&lt;</span> std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>endl<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>","fields":{"tagSlugs":["/tags/백준/","/tags/algorithm/"],"slug":"/posts/baekjoons/1676/"},"frontmatter":{"title":"[백준] 1676 : 팩토리얼 0의 개수","tags":["백준","Algorithm"],"date":"2020-03-22","description":"백준 1676번 문제 : 팩토리얼 0의 개수"}}},"pageContext":{"slug":"/posts/baekjoons/1676/"}}