<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>엘릭시르제</title>
    <link>https://sorryhyeon.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 8 May 2026 12:24:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>송댕</managingEditor>
    <item>
      <title>2026-1분기 PS 대회 결산</title>
      <link>https://sorryhyeon.tistory.com/132</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. &lt;a href=&quot;https://www.acmicpc.net/board/view/164625&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025 고려대학교 프로그래밍 경시대회(KCPC)&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 1월 17일에 개최된 2025 KCPC에서 검수진이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 초창기 검수진으로 들어가지 않았다. 이때 당시에 대학교 졸업요건을 맞추려고 똥꼬쇼를 해야했었다보니 PS에 전혀 신경쓰지 않았었다. 하지만 개최진인 &lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;b&gt;foxpython&lt;/b&gt;&lt;/span&gt;에게 긴급 요청을 받았었고 약 1주일 밖에 안 남은 시점에서 검수를 했었다만... 아무래도 시간도 시간이고 난이도도 높았다보니 정말 검수의 ㄱ도 안한거 같아서 많이 미안할 따름이다. 게다가 PS에 조금씩 흥미가 없었던 터라 게을렀다보니 할 수 있던거도 못해준 거 같아 미안한 마음을 느낀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현장에도 참여하였는데 딱히 크게 한건 없고... 뭐 암튼 나에게 스스로 조금 아쉬워했다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. &lt;a href=&quot;https://www.acmicpc.net/board/view/165528&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2026 중앙대학교 프로그래밍 경시대회(CPC)&lt;/a&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년 3월 28일에 개최된 2026 CPC에서 출제진이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 자체는 나름 적당히 잘 만들어진거 같아서 좋다. 문제를 만들 때 일단 만들어놓고 풀이를 찾는 식으로 문제를 만드는데 대부분 초기에 풀이를 오버킬을 하였어서 너무 어렵지 않나 싶었는데 이후에 쉬운 풀이를 찾아서 다행히 난이도는 적당하게 만들어져서 다행이었다. 특이하게 이번 대회에서 세팅이 힘들었다. 2026 CPC는 이전 중앙대 대회를 패러디하는 컨셉을 잡았는데 모든 문제를 확인해봐도 이거 컨셉 잡는게 제일 어렵긴 했다. 그리고 세팅 기간 중에 1주일 동안 일본에 있었다보니 도저히 세팅할 시간이 없었고 &lt;a href=&quot;https://www.acmicpc.net/problem/35458&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;서로소 스도쿠 2&lt;/a&gt; 문제를 &lt;span style=&quot;color: #0000ee;&quot;&gt;&lt;b&gt;foxpython&lt;/b&gt;&lt;/span&gt;에게 맡겼다. 아까 언급한 오버킬 했던 정해가 깔끔하게 바뀌어서 맡기길 잘한거 같다. 굿.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현장에도 참여를 했고 스코어보드 해설도 도맡아 하였다. 사실 부드럽게 잘 진행했는지는 기억은 잘 나지 않는다. 대회 중간에는 지문으로 인한 이슈로 인해 내 문제가 아니었어도 이상하게 너무 떨었고 공황이 심해졌었다. 너무 떨렸고 속이 안좋았었다. 그러다보니 스코어보드 해설을 할 때 문제가 A2까지 있었는지 A3까지 있었는지 너무 헷갈렸었다. ㅠㅠ 다행히 불만을 얘기하는(?) 분이 없으셔서 '좋게 한거겠지?' 라는 생각을 하고 있다.. 그리고 좀 나아지고 나서 에디토리얼 해설까지 하며 대회를 무사히 마쳤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직하게 2026년에는 크게 PS에 대해 생각이 없다. 학생 신분으로 참여할 대회가 없는건 물론이고 경제적 여유가 크게 없고 흥미를 매우 잃었기 때문이다. 하지만 취미로는 아직까지도 좋아하고 있다. 올해 2분기에는 또 어떤 대회를 운영할지 기대는 되지만 내가 먼저 나서서 움직일 마음은 없다.&lt;/p&gt;</description>
      <category>PS 주저리</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/132</guid>
      <comments>https://sorryhyeon.tistory.com/132#entry132comment</comments>
      <pubDate>Wed, 1 Apr 2026 18:50:40 +0900</pubDate>
    </item>
    <item>
      <title>매내처 없이 해싱을 이용하여 푸는 방법</title>
      <link>https://sorryhyeon.tistory.com/131</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매내처는 어떤 문자열 $S$에 대해 모든 위치를 중심으로 하는 가장 긴 팰린드롬 부분 문자열의 길이를 $O(|S|)$에 구할 수 있습니다. 하지만 매내처는 이해하기 까다롭고 생각하고 하는 일이 명확하다보니 이 알고리즘이 대회에 나오는 빈도가 낮습니다. 따라서 충돌만 피할 수 있으면 어떤 부분 문자열 $S'$이 존재하는지 빠르게 파악하는 해싱을 이용하여 가장 긴 팰린드롬 부분 문자열이 있는지, 그리고 그 길이가 최대 몇인지 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 여기서 말하는 문자열에서 해싱은 롤링 해시을 이용한 라빈-카프를 의미합니다. 여기서는 매내처를 대체하는 방법에 대해서만 설명하겠습니다. 그리고 이 문서는 모두 1-based index로 작성되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 $S$가 있습니다. 그리고 $S$를 뒤집은 문자열 $R$이 있습니다. 각각의 문자열의 prefix에 대한 해시 값을 미리 계산해둡시다. $S[l, r]$를 $S$의 $l$번째부터 $r$번째까지의 부분 문자열이라고 정의하면, $S[l, r]$이 팰린드롬이라는 것은 $S[l, r] = \text{reverse}(S[l, r])$를 의미하겠네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 $S[l, r]$이 팰린드롬인지 확인하기 위해서 $S[l, r]$의 해시 값과 $R$에서 대응되는 구간의 해시 값을 비교하면 됩니다. 그럼 아까 정의했던 문자열 $R$을 이용하여 $R$의 어떤 구간을 봐야하는지 알아봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$S$에서 인덱스 $i$에 있는 문자는 $R$에서는 인덱스 $|S|-i+1$에 위치합니다. 따라서 $S[l, r]$에 대응되는 것은 $R[|S|-r+1, |S|-l+1]$이 됩니다. 예를 들어서 $S$는 &quot;abcdcbg&quot;라는 문자열이라고 해 봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDiuIz/dJMcadU9yoZ/TJ7NeLBEKG3T4LVAOyCvG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDiuIz/dJMcadU9yoZ/TJ7NeLBEKG3T4LVAOyCvG1/img.png&quot; data-alt=&quot;예를 들어 $S[3, 6] = cdcb$이고 이에 대응하는 $R$은 $R[2, 5] = bcdc$이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDiuIz/dJMcadU9yoZ/TJ7NeLBEKG3T4LVAOyCvG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDiuIz%2FdJMcadU9yoZ%2FTJ7NeLBEKG3T4LVAOyCvG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1454&quot; height=&quot;242&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;예를 들어 $S[3, 6] = cdcb$이고 이에 대응하는 $R$은 $R[2, 5] = bcdc$이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 어느 구간 $[l, r]$이 팰린드롬인지 확인하는 건 $S[l, r]$의 해시 값과 $R[n-r+1, n-l+1]$의 해시 값이 같으면 팰린드롬이겠죠. 물론 충돌이 일어나지 않는다는 전제 조건이 필요하겠네요. 이 방법으로 &lt;a href=&quot;https://www.acmicpc.net/problem/11046&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BOJ 11046&lt;/a&gt;을 간단하게 풀 수 있습니다. 매내처랑 마찬가지로 각 쿼리를 $O(1)$에 풀 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;코드&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/012642095d8b390fcec3568cc69f7735.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리가 많아서 FASTIO를 사용했고, 위에 작성한 대로 쿼리에서 범위만 주면 빠르게 팰린드롬인지 알 수 있습니다. 여기서는 모듈러를 $10^{9}+9$로 고정하고 base를 $[256, 10^{4}]$로 설정하였습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 $S[l, r]$가 팰린드롬 문자열인지 아닌지는 알겠는데, 문자열이 주어졌을 때 가장 긴 팰린드롬 부분 문자열의 길이나 팰린드롬인 부분 문자열들의 개수는 어떻게 구하나요? 이는 이분 탐색을 이용하면 풀 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 생각해보면 길이가 $L$인 팰린드롬이 문자열 $S$에 있는가는 $S[1, 1+L-1]$부터 $S[|S|-L+1, |S|]$까지 전부 봐서 팰린드롬이 하나라도 있으면 되겠네요! 만약에 길이 $L$인 팰린드롬이 문자열 $S$에 있다면 하한을 늘리면서 이분 탐색을 하면 되지 않을까요? 안타깝게도 이 방식은 통하지 않습니다. 위의 문자열 $S$만 봐도 $L=3$인 팰린드롬 문자열은 존재하지만 $L=4$인 팰린드롬인 문자열은 존재하지 않고, $L=5$인 팰린드롬은 또 존재하네요. 즉 단조성을 띄지 않기 때문에 이 방식의 이분 탐색을 이용할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 다시 보면, 팰린드롬은 항상 어떤 중심을 기준으로 좌우 대칭입니다. 그래서 길이를 기준으로 하지말고 중심을 기준으로 팰린드롬인지 파악해봅시다. 그리고 홀수 길이의 팰린드롬의 경우는 어떤 문자 하나를 중심으로 기준 잡을 수 있지만 짝수 길이의 팰린드롬은 그럴 수 없으므로 두 문자를 중심으로 기준을 잡아봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDiuIz/dJMcadU9yoZ/TJ7NeLBEKG3T4LVAOyCvG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDiuIz/dJMcadU9yoZ/TJ7NeLBEKG3T4LVAOyCvG1/img.png&quot; data-alt=&quot;제일 긴 홀수 팰린드롬은 $S[2, 6] = bcdcb$이므로 길이가 $5$인 팰린드롬 문자열이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDiuIz/dJMcadU9yoZ/TJ7NeLBEKG3T4LVAOyCvG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDiuIz%2FdJMcadU9yoZ%2FTJ7NeLBEKG3T4LVAOyCvG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1454&quot; height=&quot;242&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;제일 긴 홀수 팰린드롬은 $S[2, 6] = bcdcb$이므로 길이가 $5$인 팰린드롬 문자열이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 홀수 길이의 팰린드롬부터 살펴보죠. 위의 문자열 $S$를 보면 $S[2, 6]$은 $L=5$인 홀수 길이의 팰린드롬 문자열입니다. 그러면 중심 인덱스 $i=4$이고, 반지름 $r=2$인 팰린드롬으로 $S[i-r, i+r] = S[2, 6]$이라고도 생각 할 수 있겠네요. 그리고 그 길이 $L=2r+1=5$로 딱 맞습니다. 중심 $i$를 고정하면 반지름 $r=0$, 즉 길이가 $1$인 문자열은 항상 팰린드롬이고 어떤 $r = k$에서 팰린드롬이 불가능하다면 $r &amp;gt; k$인 팰린드롬은 존재하지 않습니다. 따라서 중심 $i$에 대해서 $r=0, 1, 2, \cdots$ 에 대한 팰린드롬은 단조성을 띄게 됩니다. 중심을 고정하고 반지름에 대해 이분 탐색을 하면 되겠군요! 그럼 중심 $i$를 $1$부터 $|S|$까지 확인해서 최대가 되는 $r$를 찾는 문제로 바꿀 수 있게 됩니다. 물론 팰린드롬의 최대 길이는 $|S|$를 넘길 수 없기 때문에 $r$의 상한을 적절히 조절하여 순회 해주시면 되겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nophL/dJMcafMg6nT/aXff7kLGd1bHtRNbOKHT90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nophL/dJMcafMg6nT/aXff7kLGd1bHtRNbOKHT90/img.png&quot; data-alt=&quot;여기서 제일 긴 짝수 팰린드롬은 $S[2, 5]=bccb$이고 제일 긴 홀수 팰린드롬은 $S[5, 7]=bfb$이다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nophL/dJMcafMg6nT/aXff7kLGd1bHtRNbOKHT90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnophL%2FdJMcafMg6nT%2FaXff7kLGd1bHtRNbOKHT90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1450&quot; height=&quot;246&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여기서 제일 긴 짝수 팰린드롬은 $S[2, 5]=bccb$이고 제일 긴 홀수 팰린드롬은 $S[5, 7]=bfb$이다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 짝수 길이의 팰린드롬을 살펴보겠습니다. 새로운 문자열 $S = abccbfb$를 살펴보죠. $S[2, 5]$은 $L=4$인 짝수 길이의 팰린드롬 문자열입니다. 중심은 두 문자라고 생각하겠습니다. 구체적으로 $bccb$라는 팰린드롬이 있다면 중심은 $cc$를 의미합니다. 인덱스로 적으면 $i$와 $i+1$라고 생각할 수 있겠죠. 여기서는 $i=3$겠네요. 반지름은 $r=1$인 팰린드롬으로 $S[i-r, i+r+1] = S[2, 5]$라고 할 수 있습니다. 그리고 길이는 $L = 2r+2 = 4$입니다. 짝수 길이의 팰린드롬도 마찬가지로 중심을 고정하면 반지름 $r$에 대해서는 단조성이 생기기 때문에 이분 탐색을 할 수 있게 되네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 가장 긴 팰린드롬의 길이를 찾기 위해서 홀수 길이든 짝수 길이든 중심을 고정하고 반지름 $r$에 대해서 이분 탐색을 수행합니다. 이때 둘의 차이점은 홀수 길이는 $L=2r+1$이고 짝수 길이는 $L=2r+2$가 됩니다. 또한 홀수는 $S[i-r, i+r]$였다면 짝수는 $S[i-r, i+r+1]$네요. 함수 하나로 충분히 커버 가능하니 잘 짜봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13275&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BOJ 13275&lt;/a&gt;가 정직하게 가장 긴 팰린드롬 부분 문자열을 구하는 문제네요. 코드를 보면서 알아봅시다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;코드&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/a2f2cf262a368e4163c38dcc40f94d87.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 설명한대로 코드 로직이 전부 짜져있는데, 이분 탐색 부분 쪽을 다시 설명해보겠습니다. 먼저 f 함수의 인자는 (문자열 $S$의 길이, 팰린드롬의 중심, 반지름, 홀수(0)/짝수(1))를 의미합니다. 홀수 길이의 경우 for문에서 $i$는 팰린드롬 중심 인덱스입니다. 왼쪽으로는 최대 $i-1$칸까지 갈 수 있고, 오른쪽으로는 최대 $|S|-i$칸 만큼 갈 수 있습니다. 따라서 양쪽 끝 중에서 더 짧은 쪽을 선택합니다. 짝수 길이의 경우 for문에서 $i$는 두 중심 문자열 중에서 왼쪽 문자열의 인덱스입니다. 왼쪽으로는 최대 $i-1$만큼, 오른쪽으로는 최대 $|S|-i-1$칸 만큼 갈 수 있습니다. 따라서 이 값 중 작은 값을 선택해서 반지름 $r$의 상한을 정해줍시다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 이 코드를 살짝 변경하면 부분 문자열 중에 회문인 것의 개수도 구할 수 있습니다. &lt;a href=&quot;https://www.acmicpc.net/problem/16163&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BOJ 16163&lt;/a&gt;이 그 문제네요.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;코드&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/5c8929b2c933c3505359c43a818bc834.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 중심에서 가장 긴 팰린드롬의 반지름 $r$을 찾았다고 하면, 반지름이 $r-1, r-2, \cdots, 0$도 모두 팰린드롬이 됩니다. 따라서 $r+1$를 더해주면 됩니다. 이는 홀수, 짝수 마찬가지입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 이 풀이에는 매내처보다 시간도 오래 걸리고 해시 충돌이 발생할 수 있습니다. 해시 전처리도 해야하고 슬라이딩 윈도우 느낌으로 이분 탐색도 같이 해야하기 때문입니다. 그래서 $O(N \log N)$이 더 붙는거 같네요. 시간이 넉넉하다면 이 방법을 생각할 수 있고 해시 충돌이나 특정 모듈러 저격 데이터가 걱정이라면 런타임에 밀러-라빈을 이용해서 큰 소수를 랜덤으로 찾아내고 이를 적용하거나 큰 소수 배열을 나열하여 그 소수 중에 랜덤으로 뽑아서 적용하거나, 이중 해시를 사용해서 충돌 확률을 더 낮추는 방법이 있습니다. 물론 시간은 배로 더 들겠죠. 핵이 있는 코드포스에서는 저격을 안 당하기 위해서는 적절히 사용해야 하고 BOJ같이 핵도 없고 재채점이 빈번하지 않는 플랫폼에서는 시간만 넉넉하다면 충분히 뚫어서 정답을 맞출 수 있습니다.&lt;/p&gt;</description>
      <category>알고리즘 정리</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/131</guid>
      <comments>https://sorryhyeon.tistory.com/131#entry131comment</comments>
      <pubDate>Thu, 5 Feb 2026 16:41:44 +0900</pubDate>
    </item>
    <item>
      <title>[Atcoder] ABC 431 풀이</title>
      <link>https://sorryhyeon.tistory.com/130</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;A. Robot Balance (1:04)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;구현&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;넘어지지 않게 하기 위해서 몸통 부분의 무게를 머리 부분의 무게보다 크거나 같게 만들자. 원래부터 컸으면 추가할 필요 없으니 0이고, 아니라면 같게 만들기 위해 $H-B$을 추가하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/d45824579f68a0a40e4b06b6c8095812.js&quot;&gt;&lt;/script&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;B. Robot Weight (3:57)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;구현&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;장착되어 있는지 아닌지에 대한 배열을 하나 만들어주고 0으로 초기화한다. 장착되어 있으면 $w[i]$를 빼고 0으로 바꾸고, 장착되어 있지 않으면 $w[i]$를 더하고 1로 바꾼다. 이러면 쿼리에 대한 답을 $O(1)$로 할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/cbdcb69b3b2f834f40dc3e943028bb41.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;C. Robot Factory (10:15) (+1)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;정렬, 그리디&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$H_i \leq B_j$를 만족하는 $(i, j)$를 찾으라는 의미인데 순서는 임의로 변경해도 되므로 $H$와 $B$ 배열을 정렬해주자. 이렇게 하면 최대한 작은 값들로 만족하는 쌍을 만들 수 있다. 만약 신경쓰지 않고 그냥 쌍을 다 찾으려면 $O(NM)$으로 시간 초과난다. 나의 경우 $H_i$를 하나 잡고 $H_i \leq B_j$를 만족하는 $j$를 찾아줬다. 찾았다면 카운트를 1씩 올리고 $j=m$이라면 더 이상 쌍을 찾을 수 없으므로 $H$ 잡는 걸 그만두면 된다. 대충 시간 복잡도는 $O(N \log N+M\ \log M+N+M)$정도 될 것이다. 그리고 당연하겠지만 정렬하면 $H_{i} \leq H_{i+1}$이므로 $H_i \leq B_j$을 만족하면 $H_{i+1} \leq B_{j-t}$ ($t = 1, 2, \cdots$)가 없기 때문에 그냥 한 번만 훑으면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;모르고 급하게 짠다고 $j=m-1$일 때 반복문을 종료시켜서 1틀 했다..&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/c6cc91209234a35dbf04cabaae4ba388.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;D. Robot Customize (20:38)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;냅색&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 모든 부품들의 무게의 합을 $W$라고 하고, 머리에 붙인 부품들의 무게의 합을 $H$, 몸통에 붙인 부품들의 무게의 합을 $B$라고 하자. 그러면 $W-H=B$이고, 문제에서 $H \leq B$를 만족해야 한다 했고 $H \leq W-H$이므로 $H \leq \lfloor \frac{W}{2} \rfloor$를 만족하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 일단 모든 부품을 몸통에만 전부 붙였다고 가정하자. 이럴 때 행복의 값은 $B_i$ 값을 다 합친 값이 되고 로봇은 넘어지지 않는다. 그럼 여기서 $H \leq \lfloor \frac{W}{2} \rfloor$를 만족하면서 어떤 부품들을 머리로 옮겼을 때 행복도가 더 올라간다면 그 부품을 머리로 옮겨주면 된다. 옮길 지 말지 선택하려면 0/1 냅색을 사용하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 $H_i \leq B_i$면 몸통에 붙여두는 게 이득이니 스킵하고 그렇지 않는 경우에만 냅색을 돌리면 된다. 그럼 옮겼을 때의 행복도가 얼마나 상승하는 지에 대한 dp배열을 만들어주면 dp[(머리 부분의 무게 합)] = (옮겼을 때의 행복도의 최대 상승 값)이 된다. 0/1 냅색이므로 $\lfloor \frac{W}{2} \rfloor$부터 1씩 감소시켜 최댓값을 갱신하면 된다. 옮겼을 때의 행복도는 $H_i-B_i$가 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 dp 배열에서의 최댓값은 옮겼을 때 행복도 최대 상승 값이므로 $B_i$의 합과 더해주면 된다. 여담으로 이러면 시복이 $O( \frac{N^{3}}{2} )$가 될텐데 $N=500$이라서 애매했었지만 백준에서 1초 정도면 돌아갔기 때문에 백준보다 빠른 엣코더라면 2초는 충분해 보였다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/89594a212f6b3aa49aad912df232d340.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;E. Reflection on Grid (67:51)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;0/1 BFS&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;(1, 1)에서 시작해서 (N, M)에 도착하면서 동시에 오른쪽 방향으로 간다면 정상적으로 도착한 것이므로 그때 최소 거리를 갱신해준다. 여기서 거울을 변경한다면 1의 가중치를, 거울을 변경하지 않는 다면 0의 가중치를 주는 것인데 이는 0/1 BFS를 이용하는 것이다. 먼저 방문 배열을 넣는 것인데, 즉 dist[x][y][d]에 저장하고 이 의미는 (x, y)에 도착하고 방향이 d일 때 최솟값을 저장했다. 다음 큐에 넣을 때는 당연히 지금 거리가 dist[x][y][d]보다 작을 때만 큐에 넣는다. 그러면 계속 빙글빙글 돌아가는 상황은 생기지 않을 것이다. 아무튼 간에 A-&amp;gt;B로 변경하면 방향이 어떻게 되는지, A-&amp;gt;C로 변경하면 방향이 어떻게 되는지, ...를 모두 구현했어야 했기 때문에 어렵다기 보다는 정신이 조금 멍해진 느낌이었다. 그래서 F보다 나중에 풀었다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/a871eaf70bb11015eec16d49be5f4889.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_f&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;F. Almost Sorted 2 (43:35)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;이분 탐색, 조합론&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$B_{i+1} \geq B_{i}-D$를 찾아주자. $B_i$ 값은 $A$ 값 중 하나이므로, $A_i$를 정렬해서 $A_1, A_2, \cdots$ 순으로 차례대로 $B$ 수열을 만들었다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;구체적으로, [1, 2, 2, 5]라는 정렬된 $A$ 수열이 있다고 가정하자. 이 수열을 $B$ 수열에 맞게 넣을건데, bisect_left를 이용해서 이 $A_i$가 어디에 넣을 수 있는지 칸 수를 카운팅 해주는 것이다. 예시를 이용해서 생각해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 현재 $B$ 수열의 값은 []고, $A_1=1$이 들어갈 수 있는 칸 수는 (현재 인덱스)-($A$에서 $A_1-D$보다 크거나 같은 값이 처음 나오는 인덱스)+1을 해주면 된다. 그러면 여기서는 0-0+1이므로 [_]에 들어갈 수 있다. 따라서 현재 $1 \times 1 = 1$.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 현재 $B$ 수열의 값은 [1]이고, $A_2=2$이 들어갈 수 있는 칸 수는 1-0+1=2이다. 즉, [_, 2] 혹은 [2, _]이다. 따라서 현재 $1 \times 2 = 2$.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3. 현재 $B$ 수열의 값은 [1, 2] 혹은 [2, 1]이고 $A_3=2$가 들어갈 수 있는 칸 수는 2-0+1=3이다. 즉 [_, 1, 2], [1, _, 2], [1, 2, _], [_, 2, 1], [2, _, 1], [2, 1, _]에서 _가 $A_3$을 넣을 수 있는 칸이다. 따라서 현재 $2 \times 3 = 6$.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;4. 현재 $B$ 수열의 가능한 배열의 개수는 6개고, $A_4=5$가 들어갈 수 있는 칸 수는 3-3+1=1이다. 즉 [$B_1$, $B_2$, $B_3$, _]에만 가능하다는 의미이다. 따라서 $B$ 수열의 개수는 총 $6 \times 1 = 6$.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;...이라고 하면 안되고, 현재 2가 중복 되어 있는데 각 수는 구별되지 않으니 이 값은 $2!$로 나눠주면 된다. 따라서 답은 $3$이 나온다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;정리하면 위의 방식으로 $B$ 수열을 구하고 각 수는 구별되지 않으므로 이를 나눠주어야 한다. 어떤 값 $v$가 $k$개 있다면 $(k!)^{-1}$을 곱해줘야 한다. 모듈러 역원 연산이 필요한데 이는 파이썬으로 날먹 가능하다. $O(N \log N+N \log p)$정도 일 듯&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;script src=&quot;https://gist.github.com/jail238/ee1cbaae4e126c05059d6bc11218d151.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_g&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;G. One Time Swap 2 (-)&lt;/b&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;정리 예정&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;정리 예정 - G는 아쉽게도 못풀었고 건들지도 못했다. 나중에 실력이 쌓여지고 다시 봐야겠다.&lt;/p&gt;</description>
      <category>대회 문제</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/130</guid>
      <comments>https://sorryhyeon.tistory.com/130#entry130comment</comments>
      <pubDate>Wed, 12 Nov 2025 13:23:38 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ][Python] 백준 4445번 - Tile Cut</title>
      <link>https://sorryhyeon.tistory.com/129</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;최대 유량&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;문제는 단순하다. 격자판에서 WIN을 총 몇 개 만들 수 있는지 구하는 것인데, S -&amp;gt; W를 연결하고, N -&amp;gt; T에 연결한 다음에 I의 경우에는 W -&amp;gt; I, I -&amp;gt; N을 연결하면 된다. 하지만 이렇게만 하면 틀린다. I는 단 한 개 사용해야 하기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;win.png&quot; data-origin-width=&quot;72&quot; data-origin-height=&quot;67&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GauLu/btsPvqvhRHO/4K4XKL0KgUjiYRYPFDgAxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GauLu/btsPvqvhRHO/4K4XKL0KgUjiYRYPFDgAxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GauLu/btsPvqvhRHO/4K4XKL0KgUjiYRYPFDgAxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGauLu%2FbtsPvqvhRHO%2F4K4XKL0KgUjiYRYPFDgAxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;72&quot; height=&quot;67&quot; data-filename=&quot;win.png&quot; data-origin-width=&quot;72&quot; data-origin-height=&quot;67&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이런 경우가 바로 틀리게 되는 원인인데, I는 1개 밖에 없지만 WIN을 2개 만들 수 있기 때문이다. 이를 방지하기 위해서는 간단하게 I에 대해 정점 분할을 해서 단 한 개의 I에만 유량을 흘리게 하면 된다. 여담으로 이 문제의 입력이 좀 귀찮은 편이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/jail238/1fade2c2a664ea022d481240fe410913.js&quot;&gt;&lt;/script&gt;</description>
      <category>BOJ</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/129</guid>
      <comments>https://sorryhyeon.tistory.com/129#entry129comment</comments>
      <pubDate>Wed, 23 Jul 2025 17:13:52 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ][Python] 백준 14317번 - Sherlock and Watson Gym Secrets (Large)</title>
      <link>https://sorryhyeon.tistory.com/128</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제 링크: &lt;a href=&quot;https://www.acmicpc.net/problem/14317&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/14317&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;정수론, 포함 배제의 원리, 분할 정복을 이용한 거듭제곱&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$N \leq 10^{18}$인 $i$, $j$가 있을 때 $(i^{A} + j^{B}) \pmod K = 0$와 $i \neq j$를 만족하는 순서 쌍 ($i$, $j$)의 개수를 구하는 문제이다. 굳이 위에 $10^{18}$을 언급하는 이유는 나이브한 $O(N^{2})$ 풀이는 쳐다도 볼 수가 없다는 뜻이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 주목해야 하는건 $K$의 범위다. $10^{5}$보다 작거나 같으므로 이를 이용해보자. 먼저, '$N$보다 작거나 같은 $i$가 $K$로 나누었을 때 나머지가 $r$인 값은 총 몇 개 있는가?' 라는 해답부터 생각하면 된다. 당연하겠지만 $0 \leq r &amp;lt; K$인 모든 값을 뜻한다. $N$을 $K$로 나누었을 때의 몫을 $p$, $N$을 $K$로 나누었을 때의 나머지를 $q$라고 하면, $r = 0$ 또는 $q &amp;lt; r &amp;lt; K$인 것들은 각각 $p$개 있고, $1 \leq r \leq q$인 것들은 각각 $p+1$개 있다. 개수들을 배열에다가 채워놓자. 나는 배열의 인덱스를 $r$로 정하고 개수를 채워나갔다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 $r^{A} \bmod K = u \ (0 \leq u &amp;lt; K) $도 생각해볼 수 있다. 여기서 구하고자 하는건 $i \bmod K \ (i \leq N)$를 했을 때 나머지가 $r$인 값들을 $A$제곱하고 $K$로 나눈 나머지가 $u$인 값의 개수를 구하자는 의미다. $i \bmod K$를 했을 때 나머지가 $r$인 값은 우리가 위에서 발견했으니, $r^{A} \bmod K$&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;한 값 $x$를 구하고 $\text{acnt}$라는 $K$ 크기의 배열을 생성한 후 $\text{acnt[x]}$에 아까 구한 배열을 이용해서 더해주면 된다. $r^{B} \bmod K = u \ (0 \leq u &amp;lt; K) $도 마찬가지로 구해준다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 원래 식 $(i^{A} + j^{B}) \pmod K = 0$으로 돌아와서 $i^{A} \bmod K = u$라면, $j^{B} \bmod K = (K-u) \bmod K \ (0 \leq u &amp;lt; K) $면 성립한다. 이건 위에서 다 구해줬으니 $u$에 관해서 반복문을 돌려주고, 마지막으로 $i = j$한 경우만 빼주자. 즉 $(i^{A} + i^{B}) \pmod K = 0$인 값들만 빼주면 되므로 위에서 구한 배열로 활용하자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;경우의 수는 $10^{9}+7$로 나눈 나머지 값을 구하라고 했으니 나머지 연산을 잘 활용하여 답을 구하자.&lt;/p&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/jail238/396c80d4aa4e6755788a45c8133dd66b.js&quot;&gt;&lt;/script&gt;</description>
      <category>BOJ</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/128</guid>
      <comments>https://sorryhyeon.tistory.com/128#entry128comment</comments>
      <pubDate>Fri, 27 Jun 2025 14:25:02 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ][Python] 백준 19124번 - Binomial Coefficient</title>
      <link>https://sorryhyeon.tistory.com/127</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제 링크: &lt;a href=&quot;https://www.acmicpc.net/problem/19124&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/19124&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;정수론&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;설명은 정말 간단한 문제. ${}_{n}C_{k} \bmod 2^{32}$를 구하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$2^{32}$는 매우 큰 수이기도 하고, 합성수여서 뤼카 정리를 사용하기에도 빡세보인다. 먼저 가장 쉬운 판별을 해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;${}_{n}C_{k} = 2^E \cdot U$로 나타낼 때 $E \geq 32$이면 나누어떨어지므로 $U$를 계산할 필요가 없어진다. 이 $E$를 구하는 방법이라면 &lt;a href=&quot;https://en.wikipedia.org/wiki/Legendre%27s_formula&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Legendre's formula&lt;/a&gt;를 이용해도 좋고 어렵지 않다. 다만 $p = 2$의 경우에는 $\nu_{2}(n!) = n - s_2(n)$($n$을 이진수로 나타내었을 때 $1$의 개수)로도 나타낼 수 있으니, $\nu_{2}({}_{n}C_{k})$는 $n-s_2(n)-k+s_2(k)-(n-k)+s_2(n-k)$이므로,&amp;nbsp; $s_2(k)+s_2(n-k)-s_2(n)$로도 구하는 것이 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;구했다면 $32$ 이상인지 확인하여, $0$을 출력할 지 결정하자. 만약 $32$ 미만이라면 이때부터 머리가 아파진다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$p$를 $2^{32-E}$로 나눈 몫, $q$를 $2^{32-E}$로 나눈 나머지라고 하면 $U = p \cdot 2^{32-E} + q$가 된다. $U$ 값을 원래 식에 넣으면 $((p \cdot 2^{32-E} + q) \cdot 2^E)$이므로 $ p \cdot 2^{32} + q \cdot 2^E$가 된다. 이 식에 $ \bmod 2^{32}$를 하면 이제 $(q \cdot 2^{E}) \bmod {2^{32}}$가 되므로 $((U \bmod {2^{32-E}}) \cdot 2^E) \bmod {2^{32}}$를 구해주면 된다. 이렇게 되면 $U$에 대한 값을 조금 더 작은 값으로 구할 수 있게 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;한편으로 우리가 이 $U$ 값을 구해야 하는 이유는 $2$를 모두 걸렀기 때문에 역원 연산이 가능하다는 점이다. &lt;/span&gt;그러면 $m!$을 다음과 같이 생각해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$$m! = \left(\prod_{i=1, \text{ odd}}^m i\right) \cdot \left(\prod_{i=1, \text{ even}}^m i\right) = \left(\prod_{i=1, \text{ odd}}^m i\right) \cdot 2^{\lfloor \frac{m}{2} \rfloor} \cdot (\lfloor \frac{m}{2} \rfloor)! $$&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이런 식으로 $m!$을 재귀적으로 구할 수 있다. 여기서 우리가 생각해보아야 할 점은 이 $U$ 값은 현재 $2$가 곱해져있지 않다는 점이다. 그러면 $2$를 뺀 값은 저 식보다 간단해질 거 같지 않은가?&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;$m!_{(2)}$를 $m!$에서 $2$의 거듭제곱을 모두 제거한 값이라고 정의하자. &lt;span&gt;위의 식을 이용하여 $m!_{(2)}$을 다음과 같은 식으로 바꿀 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;$$ m!_{(2)} = \left(\prod_{i=1, \text{ odd}}^m i\right) \cdot (\lfloor \frac{m}{2} \rfloor)! $$&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$U$ 값은 $\frac{n!_{(2)}}{k!_{(2)}(n-k)!_{(2)}}$가 된다. 이제 $m!_{(2)}$만 구할 줄 알면 분수 꼴로 되어진 값을 우리는 모듈러 역원을 통해 구할 수 있게 되었다!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$(\frac{n!_{(2)}}{k!_{(2)}(n-k)!_{(2)}}) \bmod {2^{32-E}}$을 구하기 위해 위의 식을 토대로 재귀적으로 계산해야 한다. 여기서 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;$\prod_{i=1, \text{ odd}}^{2^{16}-1} (i + 2^{16} \cdot N) (N=0, 1, 2, \cdots) \bmod {2^{32}}$&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;는 항상 일정한 값을 가지므로 계산을 압축할 수 있다. 분할 정복을 이용한 거듭제곱으로 구간 곱을 빠르게 계산해주고, 나머지는 나이브하게 곱해져도 반복 개수가 그렇게 크지 않으므로 빠르게 구할 수 있다. $n!_{(2)}$, $(k!_{(2)})^{-1}$와&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;$((n-k)!_{(2)}) ^ {-1}$&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;를 구했다면, $U \bmod 2^{32-E}$를 구한 후 최종적으로 값을 구해주자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/jail238/125ce079d17ad2af669a8a665662a814.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>BOJ</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/127</guid>
      <comments>https://sorryhyeon.tistory.com/127#entry127comment</comments>
      <pubDate>Wed, 25 Jun 2025 13:07:07 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ][Python] 백준 29537번 - Большая сумма</title>
      <link>https://sorryhyeon.tistory.com/126</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제 링크: &lt;a href=&quot;https://www.acmicpc.net/problem/29537&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/29537&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;오일러 피 함수, 유클리드 호제법, 정수론&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;지문에서 간단하게 $\sum\limits_{d|n}{\sum\limits_{i = 1}^n{\mathrm{gcd}(d, i)}}$만 구하면 된다고 적혀져있다. 하지만 $n$은 $10^{12}$이므로 나이브하게 돌아가진 않을거니 식 정리를 해야한다. 먼저 시그마를 바꿔치기 해보자. $$ \sum_{i=1}^{n} \left( \sum_{d \mid n} \gcd(d, i) \right) $$&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이제 $\sum_{d \mid n} \gcd(d, i)$를 잘 변환하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;우리는 약수 $d$를 고정하고 계산하는게 아니라 $i$를 고정하고 약수 $d$를 바꿔가며 푸는 것으로 바뀐다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;그러면 저 안의 값이 약수 $d$와 $i$의 최대공약수를 묻고 있는데, \( \gcd(d, i) \) &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;값이 같으면 $\sum_{d \mid n} \gcd(d, i)$ 값도 같아지는 것을 알 수 있다. 따라서 같은 값들은 묶어내고 계산하면 된다. 구체적으로 $n$의 약수인 $d$에 대해 $ \gcd(n, i) = d$를 만족하는 $i$가 몇 개인지 찾아주고 $d$일 때의 $\sum_{d \mid n} \gcd(d, i)$ 값만 찾아주면 된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;$ \gcd(n, i) = d$를 만족하는 $i$의 개수는 간단하게 $\phi( \frac{n}{d} )$로 나타낼 수 있다. 마찬가지로 $\sum_{g \mid n} \gcd(g, d)$ 값을 구하면 된다. 이건 그냥 직접 구해줘도 된다. 이렇게 구하면 식은 다음과 같다. $$ \sum_{d \mid n} \phi\left(\frac{n}{d}\right) \times \left( \sum_{g \mid n} \gcd(g, d) \right) $$&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;최종적으로 우리는 $n$을 소인수분해하여 약수 $d$를 모두 구하고, 반복문으로 $\phi( \frac{n}{d} )$와 $\sum_{g \mid n} \gcd(g, d)$의 값을 곱해주면 된다. 시간 복잡도는 대략 \( O\left( \sqrt{n} + D \left( \sqrt{n} + D \log n \right) \right) \) (\( D \)는 \( n \)의 약수의 개수).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/jail238/6f5c49e56abbf78882d41d102709b39f.js&quot;&gt;&lt;/script&gt;</description>
      <category>BOJ</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/126</guid>
      <comments>https://sorryhyeon.tistory.com/126#entry126comment</comments>
      <pubDate>Tue, 17 Jun 2025 00:58:36 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ][Python] 백준 8483번 - Earthquake</title>
      <link>https://sorryhyeon.tistory.com/125</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제 링크: &lt;a href=&quot;https://www.acmicpc.net/problem/8483&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/8483&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;유리 등차수열의 내림 합, 정수론&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$Ax + By &amp;gt; C$를 만족하는 위치에 모든 마천루가 사라졌다는 것은 $ Ax + By &amp;le; C$를 만족하는 위치에는 마천루가 남아있다는 뜻이다. 그리고 $x &amp;ge; 0$, $y &amp;ge; 0$인 정수 ($x$, $y$) 쌍의 마천루의 개수를 묻는 문제이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;일단 $y$에 대해 식을 정리하면 $y \leq \frac{C-Ax}{B}$이고, 정수 값이어야 하니 $y$의 범위는 $0$부터 $\lfloor \frac{C-Ax}{B} \rfloor$까지. 즉 $\lfloor \frac{C-Ax}{B} \rfloor + 1$개다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$x$도 마찬가지로 $y$가 $0$ 이상의 값을 가지려면, $C - Ax \geq 0$여야 한다. 그러면 자연스럽게 $x \leq \frac{C}{A}$가 되는거고, $x$의 범위는 $0$부터 $ \lfloor \frac{C}{A} \rfloor$까지다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위에서 만족하는 정수 쌍의 개수는 다음과 같이 나타낼 수 있다. $$ \sum_{x=0}^{\lfloor C/A \rfloor} \left( \lfloor \frac{C - Ax}{B} \rfloor + 1 \right) $$&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;상수를 정리하면 최종적으로 다음과 같다. $$ \sum_{x=0}^{\lfloor C/A \rfloor} \left\lfloor \frac{-Ax + C}{B} \right\rfloor + \lfloor \frac{C}{A} \rfloor + 1 $$&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 정리하면 앞의 계산은 floor sum으로 구해서 깔끔하게 구할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/jail238/7ebd02b7773212723ebf2b7e10ee8df8.js&quot;&gt;&lt;/script&gt;</description>
      <category>BOJ</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/125</guid>
      <comments>https://sorryhyeon.tistory.com/125#entry125comment</comments>
      <pubDate>Fri, 13 Jun 2025 22:49:48 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ][Python] 백준 28383번 - 다섯 제곱수의 합</title>
      <link>https://sorryhyeon.tistory.com/124</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555; font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;문제 링크: &lt;a href=&quot;https://www.acmicpc.net/problem/28383&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/28383&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;소인수분해, 정수론&lt;/blockquote&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;네 제곱수의 합의 가짓수를 구하는 방법은 &lt;a href=&quot;https://en.wikipedia.org/wiki/Jacobi%27s_four-square_theorem&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Jacobi's four-square theorem&lt;/a&gt;를 이용하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;간략하게 설명하면 $r_4(n)$이 $n$의 네 제곱수의 합의 가짓수를 구하는 함수인데,&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$n$이 홀수라면 $8\sigma(n)$를 구하면 되고, $n$이 짝수라면 $ n = 2^{k}m$으로 나타낼 때, $24\sigma(m)$을 구하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;당연하겠지만 $\sigma(n)$를 구하기 위해서 소인수분해가 들어간다. $n = p_1^{q_1}p_2^{q_2}p_3^{q_3}\cdots p_k^{q_k}$으로 나타내면 $\prod_{i=1}^k \frac{p_i^{q_i + 1} - 1}{p_i - 1}$으로 구하면 되기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 구했다면 네 제곱수의 합의 가짓수는 구해진거고, 문제는 다섯 제곱수의 합의 가짓수를 구해야하는데 조금만 생각해보자.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;$t = 0$부터 시작해서 $n \geq t$를 만족할 때까지 $1$씩 점점 더하면서 $r_4(n-t^{2})$을 구하면 된다. $t = 0$일 때를 제외하면 양수, 음수가 있으니 모두 고려하면 $r_5(n) = r_4(n) + 2\sum_{\substack{t=1 \\ t^2 \leq n}} r_4(n - t^2)$를 계산하면 된다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;시간제한이 5.555초이다보니 폴라드 로가 아닌 일반적인 소인수분해로도 풀어지긴 한다. 물론 시간 퍼포먼스는 5배 가량 차이나지만... 따라서 코드도 일반적인 소인수분해 코드를 올림.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;toc-문제 풀이&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;script src=&quot;https://gist.github.com/jail238/4504582754a4a6ef44dcf45ef7d856c8.js&quot;&gt;&lt;/script&gt;</description>
      <category>BOJ</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/124</guid>
      <comments>https://sorryhyeon.tistory.com/124#entry124comment</comments>
      <pubDate>Thu, 5 Jun 2025 12:46:14 +0900</pubDate>
    </item>
    <item>
      <title>$1$부터 $N$까지의 합에 $1$부터 $N$까지의 합 붙이기... $\times \infty$</title>
      <link>https://sorryhyeon.tistory.com/123</link>
      <description>&lt;script&gt; MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; &lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 무슨 의미냐면, 먼저 $1$부터 $N$까지의 합부터 생각해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\sum\limits_{i=1}^{n} i$는 간단하게 $\frac{n(n+1)}{2}$로 쓸 수 있다. 그러면 이 값에 다시 시그마를 붙이면? $\sum\limits_{i=1}^{n} \frac{i(i+1)}{2}$이 된다. 이 값은 무엇일까? 일단은 그냥 식 정리를 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\frac{1}{2} \sum\limits_{i=1}^{n} (i^{2}+i)$로 바꿔 쓸 수 있고,&amp;nbsp; $ \sum\limits_{i=1}^{n} i^{2} = \frac{n(n+1)(2n+1)}{6} $이므로 $\frac{1}{2} (\frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2})$가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2}$를 잘 정리해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\frac{n(n+1)(2n+1)}{6} + \frac{n(n+1)}{2} = \frac{n(n+1)(2n+1)}{6} + \frac{3n(n+1)}{6}&amp;nbsp; = \frac{ n(n+1)(2n+1)+3)}{6} = \frac{ n(n+1)(2n+4)}{6} = \frac{ n(n+1)(n+2)}{3} $가 된다. 이제 원래의 식에 적용해서$\frac{1}{2} \sum\limits_{i=1}^{n} (i^{2}+i) =$ $ \frac{ n(n+1)(n+2)}{6} $가 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 식은 예상하겠지만 $\sum\limits_{i=1}^{n} \frac{ i(i+1)(i+2)}{6} $이 되겠다. 당연히 이 식을 구하기에는 너무 많은 식 정리가 필요하다. 여기서 &lt;a href=&quot;https://en.wikipedia.org/wiki/Hockey-stick_identity&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;b&gt;하키스틱 항등식&lt;/b&gt;&lt;/a&gt;을 사용한다면 그 다음 시그마, 그 다음다음 시그마도 잘 구할 수 있다. 먼저 이 하키스틱 항등식은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$\sum\limits_{j=r}^{m} \binom{j}{r} = \binom{m+1}{r+1} $&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 만들었던 식 $\frac{n(n+1)}{2}$는 $\binom{n+1}{2}$로도 쓸 수 있다. $\sum\limits_{i=1}^{n} \binom{i+1}{2}$는 저 위의 식에서 $r = 2$, $j = i+1$라고 보면 $\sum\limits_{i=1}^{n} \binom{i+1}{2} = \sum\limits_{j=2}^{n+1} \binom{j}{2} = \binom{n+2}{3} $이 된다. $\frac{n(n+1)(n+2)}{6}$는 $\binom{n+2}{3}$이므로, 등식이 성립된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 식 정리를 어렵게 해야했던 $\sum\limits_{i=1}^{n} \frac{ i(i+1)(i+2)}{6} $는 이제 $\binom{n+3}{4}$라는 것을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;쉽게&lt;span&gt; 알 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13430&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BOJ 13430&lt;/a&gt;&lt;/p&gt;</description>
      <category>PS 수학</category>
      <author>송댕</author>
      <guid isPermaLink="true">https://sorryhyeon.tistory.com/123</guid>
      <comments>https://sorryhyeon.tistory.com/123#entry123comment</comments>
      <pubDate>Wed, 5 Mar 2025 19:17:22 +0900</pubDate>
    </item>
  </channel>
</rss>