{"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":"a3488726-3de0-5b3d-83c9-c86153101dd2","html":"<h1>11401번 : 이항 계수 3</h1>\n<p>👉 <a href=\"https://www.acmicpc.net/problem/11401\">문제 바로가기</a></p>\n<h2>배경 지식</h2>\n<ul>\n<li><code class=\"language-text\">이항 계수(Binomial coefficient)</code> : 주어진 크기 집합에서 원하는 개수만큼 <strong>순서없이</strong> 뽑는 조합의 가짓 수</li>\n<li><code class=\"language-text\">분할 정복(Divide and Conquer)</code> : 그대로 해결할 수 없는 주어진 문제를 <strong>더 이상 문제를 나눌 수 없을 때까지 둘 이상의 작은 부분 문제로 분할하여 문제를 해결</strong>하고, <strong>구해진 문제들을 원 문제로 병합하여 해결</strong>하는 알고리즘</li>\n</ul>\n<h2>푼 방법</h2>\n<p>어려웠다. 이 문제에 쓰이는 수학 공식을 모른다면 풀기 어려운 문제다.</p>\n<p>다음 포스트를 참고해서 풀었다.</p>\n<blockquote>\n<p><a href=\"https://kyunstudio.tistory.com/60\">https://kyunstudio.tistory.com/60</a></p>\n</blockquote>\n<p>푼 방법을 적어봤자 위 포스트와 내용이 비슷할 것이기 때문에 굳이 적지 않겠다.</p>\n<p>단 하나 위 포스트의 코드와 다른 것이 있다면, 본 문제에서 전처리는 필요 없을 것 같아 <strong>전처리하지 않고 입력받은 이항계수를 페르마의 소정리를 이용해 바로 구했다.</strong></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<span class=\"token macro property\">#<span class=\"token directive keyword\">define</span> P 1000000007LL</span>\n\n<span class=\"token keyword\">typedef</span> <span class=\"token keyword\">unsigned</span> <span class=\"token keyword\">long</span> <span class=\"token keyword\">long</span> ull<span class=\"token punctuation\">;</span>\n\null mod_power <span class=\"token punctuation\">(</span>ull x<span class=\"token punctuation\">,</span> ull y<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\tull ret <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>y<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// y > 0</span>\n\t\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>y <span class=\"token operator\">&amp;</span> <span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token comment\">// y % 2</span>\n\t\t\tret <span class=\"token operator\">*</span><span class=\"token operator\">=</span> x<span class=\"token punctuation\">;</span>\n\t\t\tret <span class=\"token operator\">%</span><span class=\"token operator\">=</span> P<span class=\"token punctuation\">;</span> <span class=\"token comment\">// if not mod, delete</span>\n\t\t<span class=\"token punctuation\">}</span>\n\t\tx <span class=\"token operator\">*</span><span class=\"token operator\">=</span> x<span class=\"token punctuation\">;</span>\n\t\tx <span class=\"token operator\">%</span><span class=\"token operator\">=</span> P<span class=\"token punctuation\">;</span> <span class=\"token comment\">// if not mod, delete</span>\n\t\ty <span class=\"token operator\">/</span><span class=\"token operator\">=</span> <span class=\"token number\">2</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span>\n\t<span class=\"token keyword\">return</span> ret<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> k<span class=\"token punctuation\">;</span>\n\tull factorial<span class=\"token punctuation\">[</span><span class=\"token number\">4000001</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">}</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 operator\">>></span> k<span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>n <span class=\"token operator\">==</span> k <span class=\"token operator\">||</span> k <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        std<span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span>cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token number\">1</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        <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\t\n\tfactorial<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">1</span><span class=\"token punctuation\">;</span>\n\t\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\">2</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>\n\t\tfactorial<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>factorial<span class=\"token punctuation\">[</span>i<span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> i<span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> P<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 punctuation\">(</span>factorial<span class=\"token punctuation\">[</span>n<span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> <span class=\"token function\">mod_power</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>factorial<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span><span class=\"token operator\">*</span>factorial<span class=\"token punctuation\">[</span>n<span class=\"token operator\">-</span>k<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> P<span class=\"token punctuation\">,</span> P<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> P <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\t<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>\n<h3>References</h3>\n<p><a href=\"https://onsil-thegreenhouse.github.io/programming/problem/2018/04/02/problem_combination/\">https://onsil-thegreenhouse.github.io/programming/problem/2018/04/02/problem_combination/</a><br>\n<a href=\"https://sexycoder.tistory.com/67\">https://sexycoder.tistory.com/67</a><br>\n<a href=\"https://shoark7.github.io/programming/algorithm/3-ways-to-get-binomial-coefficients\">https://shoark7.github.io/programming/algorithm/3-ways-to-get-binomial-coefficients</a><br>\n<a href=\"https://www.acmicpc.net/board/view/15795\">https://www.acmicpc.net/board/view/15795</a></p>","fields":{"tagSlugs":["/tags/백준/","/tags/algorithm/"],"slug":"/posts/baekjoons/11401/"},"frontmatter":{"title":"[백준] 11401 : 이항 계수 3","tags":["백준","Algorithm"],"date":"2020-04-27","description":"백준 11401번 문제 : 이항 계수 3"}}},"pageContext":{"slug":"/posts/baekjoons/11401/"}}