<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>SafeSpot::SafePost</title>
    <link>https://safepost.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 23 May 2026 04:52:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>SafeSpot</managingEditor>
    <item>
      <title>[33479] 받아안올림</title>
      <link>https://safepost.tistory.com/entry/33479-%EB%B0%9B%EC%95%84%EC%95%88%EC%98%AC%EB%A6%BC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;문제는 만들어 놓고 풀이는 이제야 씁니다. 사실 시작이 지금(250619)이지 완성은 또 얼마나 뒤에 될지 모르겠습니다.&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;&amp;nbsp;지문이 복잡하게 쓰인 점에 대해 안타깝게 생각합니다. 실제로 출제 아이디어는 저 표현들에서 출발하긴 했습니다만 결과적으로 $\mathbb{Z}_p[x]$를 감추려고 최선을 다한 것처럼 보여지는 것이 별로네요. 하나씩 설명을 해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 상황&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자릿수 함수 $D_d(n, i)$&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;자릿수 함수 $D_d(n, i)$는 양의 정수 $n$과 $i$를 받아서 $\displaystyle \left[ \frac{n}{d^i} \right]$을 $d$로 나눈 나머지를 의미합니다. 이는 곧 $n$의 $d$진법 표현에 대해 $i$번째(zero based) 자리 숫자를 리턴하는 것입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;받아안올림 덧셈 $\oplus_p$&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;받아올림은 다들 아실 것 같습니다. 받아안올림 덧셈은 말 그대로 받아올림을 하지 않는 덧셈입니다. 10진법에서의 예시를 들자면 $9876 + 22222 = 21098$인 식입니다. 지문의 정의가 $p$진법에서의 이 연산을 수식으로 나타냄을 알 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;받아안올림 곱셈 $\otimes_p$&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;받아안올림 곱셈은 설명하기 조금 복잡한데, TODO&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;받아안올림 거듭제곱&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;은 단순히 받아안올림 곱셈을 여러 번 하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;$\omega(n; p, N)$&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TODO&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. $(\mathbb{Z}_{\geq 0}, \oplus_p, \otimes_p)$는 ring을 이룹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 이 ring은 polynomial ring $\mathbb{Z}_p[x]$와 isomorphic합니다. 이 isomorphism을 $\phi$로 둡시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. $F(x) := \phi(N)$에 대해 $F$로 생성한 아이디얼 $(F)$와 quotient ring $\mathbb{Z}_p[x] / (F)$, 그 projection map $\varphi : \mathbb{Z}_p[x] \to \mathbb{Z}_p[x] / (F)$을 생각합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 문제의 집합 $I := \{1 \oplus_p (i \otimes_p N) \mid i \in \mathbb{Z}^+\}$에 대해 $\phi[I] = \varphi^{-1}(1 + F) \setminus \{1\}$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 즉 $\phi[I]$는 $\mathbb{Z}_p[x]$의 원소 중 $(F)$로 만든 quotient ring에 $\varphi$로 project했을 때 multiplicative identity가 되는 원소를 모은 집합입니다. ($1$ 제외)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. $\omega(n; p, N)$은 $\phi(n)$이 최소 몇 번의 거듭제곱을 해야 $\phi[I]$에 속하게 되는지 묻고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6-1. $n$을 $I$에 속하게 만드는 $k$가 존재한다는 것은 $\varphi(\phi(n))^k = 1 + F$이면서 $\phi(n)^k \neq 1$인 $k$가 존재한다는 것과 동치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6-2.&amp;nbsp;$n$을&amp;nbsp;$I$에&amp;nbsp;속하게&amp;nbsp;만드는&amp;nbsp;$k$가&amp;nbsp;존재하지&amp;nbsp;않는다는&amp;nbsp;것은&amp;nbsp;$\varphi(\phi(n))^k&amp;nbsp;=&amp;nbsp;1&amp;nbsp;+&amp;nbsp;F$인&amp;nbsp;$k$가&amp;nbsp;존재하지&amp;nbsp;않는다는&amp;nbsp;것과&amp;nbsp;동치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6-3. 모든 가능한 $n$에 대해 $\phi(n)^k = 1$를 만족하는 $k$가 존재하는 $n$은 $p$개보다 적습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 여기서 새 집합 $I'$를 도입합시다. $I' := \phi^{-1}[\varphi^{-1}(1 + F)]$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7-1. $n$을 $I'$에 속하게 만드는 $k$가 존재한다는 것은 $\varphi(\phi(n))^k = 1 + F$인 $k$가 존재한다는 것과 동치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7-2. $n$을 $I'$에 속하게 만드는 $k$가 존재하지 않는다는 것은 $\varphi(\phi(n))^k = 1 + F$인 $k$가 존재하지 않는다는 것과 동치입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7-3. $\varphi(\phi(n))$의 곱셈에 대한 cyclic group이 정의되는 경우 그 order가 $k$이고, 정의되지 않는 경우 $k$는 존재하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 이제 $R := \mathbb{Z}_p[x] / (F)$에 대해 $\displaystyle \sum_{f \in R} \text{ord}(f)$를 구하고자 합니다. 여기서 $\text{ord}$가 정의되지 않을 경우 $0$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9.&amp;nbsp; $R$의 multiplicative group $R^\times := \{r \in R \mid \exists s : rs = 1\}$를 고려합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9-1. $R^\times$의 모든 원소는 곱셈에 대한 cyclic group이 정의되고 그 역도 성립합니다. 따라서 구하고자 하는 값은 $\displaystyle \sum_{f \in R^\times} \text{ord}(f)$이 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. $F(x)$를 $Z_p[x]$에서의 irreducible polynomial들로 인수분해합시다. $\displaystyle F(x) = \prod_i (f_i(x))^{e_i}$입니다.&amp;nbsp;모든&amp;nbsp;$f_i$는&amp;nbsp;irreducible이고&amp;nbsp;unique합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Chinese Remainder Theorem on Rings에 의해, $\displaystyle R = \mathbb{Z}_p[x]/(F) \cong \prod_i \mathbb{Z}_p[x]/(f_i^{e_i})$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. 자연스럽게 $\displaystyle R^\times = ( \mathbb{Z}_p[x]/(F) )^\times \cong \prod_i ( \mathbb{Z}_p[x]/(f_i^{e_i}) )^\times$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. 개별 $R_i^\times := (\mathbb{Z}_p[x]/(f_i^{e_i}))^\times$에 대해 살펴봅시다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. 임의의 $R_i^\times$에 속한 원소 $f$는 $\mathbb{Z}_p[x]/(f_i)$의 원소 $e_i$개: $( f / f_i^0 \text{ mod } f_i, \ldots, f / f_i^{e_i-1} \text{ mod } f_i)$와 일대일대응됩니다. 여기서 $f / g$는 $f$를 $g$로 나눈 몫입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. $d_i := \deg(f_i)$로 두면 $ \mathbb{Z}_p[x]/(f_i) \cong \text{GF}(p^{d_i})$이므로, $f_i$를 $t$로 치환하면 $R_i^\times \cong (\text{GF}(p^{d_i})[t] / (t^{e_i}))^\times$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. 상수항을 $1$로 고정하고 $\text{GF}(p^{d_i})$의 곱셈 구조를 떼어 $(\text{GF}(p^{d_i})[t] / (t^{e_i}))^\times \cong \text{GF}(p^{d_i})^\times \times (1 + (t\text{GF}(p^{d_i})[t]) / (t^{e_i}))^\times$를 얻습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. 임의의 $f(t) \in (1 + (t\text{GF}(p^{d_i})[t]) / (t^{e_i}))^\times$을 고려합시다. $f(t)$의 $\text{ord}$를 알아내고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. $(1 + (t\text{GF}(p^{d_i})[t]) / (t^{e_i}))$는 $p^{d_i(e_i-1)}$개의 원소로 구성되어 있습니다. 따라서 $f$의 $\text{ord}$는 $p$의 지수승 꼴이어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. $f(t)$의 항 중 상수항이 아니면서 차수가 가장 낮은 항의 차수를 $\text{MD}(f(t))$라고 합시다. 그러한 항이 없으면 $f(t) = 1$이므로 $\text{ord}$는 1입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. $f(t)$를 $\text{GF}(p^{d_i})[t]$에서 잠시 고려하면, $f^{p^r}(t)$의 $t^{\text{MD}(f(t))}$부터 $t^{\text{MD}(f(t)) p^r-1}$까지의 계수는 모두 $p$의 배수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. $\text{char }\text{GF}(p^{d_i}) = p$이므로 $\text{MD}(f^{p^r}(t)) = \text{MD}(f(t)) p^r$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. $(1 + (t\text{GF}(p^{d_i})[t]) / (t^{e_i}))$에서 $1$이 아닌 모든 항이 사라지려면 $\text{MD}(f^{p^r}(t))$가 $e_i$ 이상이어야 하고, $\text{MD}(f(t)) p^r \geq e_i$인 최소의 $p^r$이 $\text{ord}$가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23. 이제 $(1 + (t\text{GF}(p^{d_i})[t]) / (t^{e_i}))$에 속하면서 $\text{ord}$가 $p^j$를 나누는 원소의 개수 $S_{d_i, e_i}(p^j)$를 구하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24. $S_{d_i, e_i}(p^j)$에 의해 카운트되는 각 원소 $f$는 $\text{MD}(f(t)) p^{j} \geq e_i$를 만족해야 하므로 총 $p^{d_i(e_i - \lceil e_ip^{-j} \rceil)}$개입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25. $U(n) := \#\{x \in (\mathbb{Z}_p[x]/\langle f(x)\rangle)^\times \mid \text{ord}(x) | n\}$으로 정의합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;26. $U(n) = \prod_{i} \gcd(n, p^{d_i} - 1) \cdot S_{d_i, e_i}(\nu_p(n))$입니다. 여기서 $\nu_p(n)$은 $n$ 약수 중 가장 큰 $p$의 거듭제곱수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;27. $A(n) = \sum_{d|n}\mu\left(\frac{n}{d}\right)U(d)$는 $R^\times$의 원소 중 $\text{ord}$가 정확히 $n$인 원소의 개수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;28. $R^\times$의 모든 원소의 $\text{ord}$의 합 $\Sigma$를 계산합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\begin{align*}&lt;br /&gt;\Sigma &amp;amp;= \sum_{k | | R^\times |} A(k)\cdot k\\&lt;br /&gt;&amp;amp;= \sum_{k|| R^\times |}k\sum_{d|k}\mu\left(\frac{k}{d}\right)U(d)\\&lt;br /&gt;&amp;amp;= \sum_{k|| R^\times |}\sum_{d|k}k\mu\left(\frac{k}{d}\right)\prod_i \gcd(d, p^{d_i}-1)p^{d_i(e_i - \lceil e_i / p^{\nu_p(d)}) \rceil)}\\&lt;br /&gt;&amp;amp;= \sum_{d|| R^\times |}d\prod_i \gcd(d, p^{d_i}-1)p^{d_i(e_i - \lceil e_i / p^{\nu_p(d)}) \rceil)}\sum_{k|\frac{| R^\times |}{d}}k\mu(k)\\&lt;br /&gt;C(d) &amp;amp;:= d\prod_i \gcd(d, p^{d_i}-1)p^{d_i(e_i - \lceil e_i / p^{\nu_p(d)}) \rceil)}\\&lt;br /&gt;M(n)&amp;nbsp;&amp;amp;:=&amp;nbsp;\sum_{k|n}&amp;nbsp;k\mu(k)\\&lt;br /&gt;&amp;amp;= \sum_{d|| R^\times |}C(d)M\left(\frac{| R^\times |}{d}\right)&lt;br /&gt;\end{align*}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;29. $M(n)$은 아래와 같이 계산됩니다. $n$의 소인수분해 형태에 대해,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\begin{align*}&lt;br /&gt;n &amp;amp;=: \prod_{i}p_i^{e_i}\\&lt;br /&gt;M\left(\prod_{i}p_i^{e_i}\right)&amp;nbsp;&amp;amp;=&amp;nbsp;M\left(\prod_{i}p_i\right)\\&lt;br /&gt;&amp;amp;=&amp;nbsp;\sum_{S\subset\{p_1,p_2,\ldots\}}&amp;nbsp;(-1)^{|S|}&amp;nbsp;\prod_{p\in&amp;nbsp;S}p\\&lt;br /&gt;&amp;amp;=&amp;nbsp;\prod_i&amp;nbsp;(1-p_i)&lt;br /&gt;\end{align*}&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;30. 쓰다 보니 귀찮네요. 이거면 충분하겠죠?&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/33479&quot;&gt;https://www.acmicpc.net/problem/33479&lt;/a&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PS | CP/Baekjoon OJ</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/81</guid>
      <comments>https://safepost.tistory.com/entry/33479-%EB%B0%9B%EC%95%84%EC%95%88%EC%98%AC%EB%A6%BC#entry81comment</comments>
      <pubDate>Sun, 24 Aug 2025 22:50:16 +0900</pubDate>
    </item>
    <item>
      <title>학부과정 회고 / 앞으로...</title>
      <link>https://safepost.tistory.com/entry/%ED%95%99%EB%B6%80%EA%B3%BC%EC%A0%95-%ED%9A%8C%EA%B3%A0-%EC%95%9E%EC%9C%BC%EB%A1%9C</link>
      <description>&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;점점 글을 적기 귀찮아진다. 그만큼 바쁘다는 뜻이겠다. 7개 학기를 거의 다 보냈고 졸업을 한다. 3년 반동안 뭘 했는지, 이제 뭘 할지 정리하고자 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1학년 때는 색다른 경험을 많이 했다. 사실 대학 입학이라는 게 새로움의 연속이 아닐 수 없다. 서울로 올라와 혼자 살게 되고, 교양 수업에서 평생 만날 일 없을 것 같던 사람들도 만나보고, 다음 수업 가겠다고 캠퍼스를 가로지르고. 좋았던 시절이라고는 못 하겠다. 이 모든 교양 수업을 내던지고 전공 수업만 듣고 싶다고 늘 생각했었다. 다시 돌아가고 싶지 않고, 인생에 있어 한 번이면 족할 경험이라고 변함 없이 생각한다. 내가 무슨 꼴의 사람인지 알게 해 준 반대 생활의 예시였다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그래서 2학년 때엔 훨씬 즐겁게 학교를 다녔다. 여러모로 환경이 안정되어서 주도적으로 다양한 시도를 할 수 있었다. '평소엔 수업을 (안)들으며 동아리 같은 활동을 하다가 시험기간이 되면 죽어라 밤을 새고 공부를 한다' 는 생활의 틀이 잡힌 덕분이다. 동아리나 PS 관련 활동을 열심히 했고, 대회도 나가 봤다. 당분간은 사는 게 편안하겠구나 싶었는데, 학년 다 끝나갈 때쯤 적잖이 큰 일이 터져서 인생 최대의 스트레스를 맛보았다. 만약 학교마저도 귀찮은 일 투성이였으면 휴학이라도 할 뻔 했는데, 기말고사와 작은 대회 본선만 남은 시점이었어서 버틸 수 있었다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3학년 때엔 졸업을 위해 수학과 전공 수업을 열심히 들었다. 학과 동아리장도 떠맡아서 잠깐 하고. 단순히 바빴던 탓에 이 시절에 대한 회포가 없다. 되돌아 생각하면 이 때에 학부연구생 하고 연구 활동을 시작했으면 좋았겠다 싶은데, 여러 일로 심적 여유가 없었던 게 아쉬운 점이다. ICPC도 나가긴 했는데 이때쯤 PS/알고리즘에 대한 관심이 많이 떨어져서 참가에만 의의를 뒀다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4학년 1학기가 지금 다 끝나간다. 기말 시험만 앞두고 있다. 이번 학기는 졸업을 위해 12학점(더하기 청강 하나)만 듣고, 학부연구생을 시작했다. 다른 석/박사과정생들은 어떻게 공부하나 구경도 하고, 실무 프로그래밍도 해보고, 새로운 분야도 접해 보고... 가치 있는 경험을 많이 하고 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;자대 수학과 대학원에 응용수학으로 합격해서 다음 학기에 석사과정으로 바뀐다. 6개월쯤 쉬고 들어갈까 생각해 봤는데 그래봐야 놀기만 할 것 같아 말았다. 하다가 괜찮으면 통합으로 전환할까 싶기도 한데 아직 속단할 수는 없어서... 가장 괜찮은 길을 잘 찾아서 선택하고자 한다. 대학원에 들어갔다는 건 드디어 '나는 좋아하는 건 열심히 하니까 연구 일 하면 괜찮겠지' 아이디어에 대한 검증의 시간이 왔다는 뜻이기도 하다. 과연 여기에서는 선택과 집중을 핑계로 도망치지 않을 수 있을 것인가? 가장 집중해야 할 일에 대해 최대의 몰입을 유지할 수 있겠는가?&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;또 하나의 문제는 공부 주제와 방식의 변화이다. 이제 순수수학을 더 볼 일은 졸업을 위해 필요한 수학 말고는 없다. 수학 공부를 재밌게 하긴 했지만, 이제 취미의 영역으로 넘겨야 한다. 지금까지 쌓아 온 수학 베이스를 바탕으로 해서 top-down식 공부를 해야 하는데, 여기에 새로 적응하는 게 잘 될까 싶다. 처음 보는 라이브러리 docs 공부하는 것처럼 하면 될 것 같기도 하다.&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;좀 현실적인 문제는 돈이다. 돈은 항상 문제다. 예전엔 좀 덜 문제였는데, 이제는 좀 큰 문제가 됐다. 다행히 대학원 신입생 장학금을 받게 됐고, 수업조교도 신청하면 석사 수료할 때까지 등록금은 괜찮을 것 같다. 생활비는 현재로서는 불명확하다. 입학하고 나야 상황이 보일 것 같은데, 월세까지는 어찌저찌 되더라도 집에서 불닭볶음면만 씹어야 하는 건 거의 확정이지 않을까. 대학원생이 다 그런 거 아닌가?&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;내가 즐겁게 하면 다 괜찮은 거라고 생각한다. 노력에 대해 보상을 받을 마음은 조금도 없다. 이건 다 100년 거리 기차를 타고 좌석에 앉아서, 도착할 때까지 뭘 할까에 대한 이야기이기 때문이다. 친구랑 문자를 해도 되고, 휴대폰 꺼내서 유튜브 영상을 봐도 되고, 교과서 문제를 풀고 있어도 되며, 그냥 창밖을 바라보면서 경치 좋구나 해도 된다. 나는 좌석에 앉은 것에 감사하며 노트북을 꺼내기로 했다.&lt;/p&gt;</description>
      <category>open</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/80</guid>
      <comments>https://safepost.tistory.com/entry/%ED%95%99%EB%B6%80%EA%B3%BC%EC%A0%95-%ED%9A%8C%EA%B3%A0-%EC%95%9E%EC%9C%BC%EB%A1%9C#entry80comment</comments>
      <pubDate>Sun, 15 Jun 2025 19:27:59 +0900</pubDate>
    </item>
    <item>
      <title>[17318] Highway Cycling</title>
      <link>https://safepost.tistory.com/entry/17318-Highway-Cycling</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;조건은 다음과 같이 됩니다. $w_i$를 $i$번째 도로에서 달리는 속도라고 하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{gather*} E_i := k_i(w_i - v_i)^2s_i \\ E_u = \sum E_i \\ T = \sum \frac{s_i}{w_i} \end{gather*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 $E := \sum E_i$를 $\mathbf{w}$ 벡터의 공간에서 $\mathbb{R}$ 공간으로 보내는 다변수함수로 볼 수 있습니다. 마찬가지로 $T$도 그렇게 둘 수 있겠네요. $E - E_u = 0$이므로 &lt;a title=&quot;라그랑주 승수법&quot; href=&quot;https://namu.wiki/w/%EB%9D%BC%EA%B7%B8%EB%9E%91%EC%A3%BC%20%EC%8A%B9%EC%88%98%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;i&gt;라그랑주 승수법&lt;/i&gt;&lt;/a&gt;을 먹여 전체 조건을 다음과 같이 변형할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{gather*}E = E_u\\\nabla (E - E_u) = \lambda \nabla T\end{gather*}$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀어 정리하면 다음처럼 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$\begin{gather*}E = E_u\\ \lambda = -2k_iw_i^2(w_i - v_i)\text{ for every }i\end{gather*}$$&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;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;$\lambda$를 나타내는 식에서 &lt;/span&gt;$w_i$를 제외한 나머지는 모두 주어지는 값이기 때문에, 만약 어떤 $\lambda$값을 잡는다면 그에 따른 $\mathbf{w}$ 벡터를 (삼차방정식을 풀어) 찾을 수 있습니다. $\lambda$값은 큰 범위에서 $E = E_u$ 조건을 사용해 이분 탐색을 때리면 됩니다. 적절한 $\mathbf{w}$를 찾았다면 $T$를 계산할 수 있고, 그러면 그게 답이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1669914939232&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;17318번: Highway Cycling&quot; data-og-description=&quot;DanDan is always interested in challenging himself. This summer, he prepares to cycle along the Sichuan-Tibet highway to reach Lhasa. It is widely known that the Sichuan-Tibet Highway is filled with hauntingly beautiful scenery, but also happens to contain&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17318&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17318&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/n8hND/hyQK1UR60t/Jikr0sYyKDGRwAvtqquWS0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17318&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17318&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/n8hND/hyQK1UR60t/Jikr0sYyKDGRwAvtqquWS0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;17318번: Highway Cycling&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DanDan is always interested in challenging himself. This summer, he prepares to cycle along the Sichuan-Tibet highway to reach Lhasa. It is widely known that the Sichuan-Tibet Highway is filled with hauntingly beautiful scenery, but also happens to contain&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PS | CP/Baekjoon OJ</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/62</guid>
      <comments>https://safepost.tistory.com/entry/17318-Highway-Cycling#entry62comment</comments>
      <pubDate>Fri, 2 Dec 2022 02:17:03 +0900</pubDate>
    </item>
    <item>
      <title>[미분방정식] 상수 계수 Linear Homogeneous DE와 Characteristic Equation</title>
      <link>https://safepost.tistory.com/entry/%EB%AF%B8%EB%B6%84%EB%B0%A9%EC%A0%95%EC%8B%9D-%EC%83%81%EC%88%98-%EA%B3%84%EC%88%98-Linear-Homogeneous-DE%EC%99%80-Characteristic-Equation</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;2nd order의 경우를 갖고 따져보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$Ly = ay'' + by' + cy = 0, (a \neq 0, a, b, c \in \mathbb{R})$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;얘의 해가 $y = e^{rt}$의 꼴이라고 하면 방정식에 대입했을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ar^2e^{rt} + bre^{rt} + ce^{rt} = 0$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$(ar^2 + br + c)e^{rt} = 0$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 된다. 이걸 만족하는 $r$을 찾기 위해서는 $ar^2 + br + c = 0$을 풀면 된다. $e^{rt}$는 0이 될 수 없기 때문에...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 여기서 이 방정식 $ar^2 + br + c = 0$을 Characteristic Equation이라고 부르는 모양이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 잘 아는 근의 공식을 이용해 $r$을 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$r = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$$&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;$\pm$ 기호가 들어있으니 보통 해는 두 개 나올 것이고 그러면 해 $r_1, r_2$를 형태에 넣고서 선형결합하면 방정식의 일반해는 $c_1e^{r_1t} + c_2e^{r_2t}$가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까진 좋은데, 두 $r_1$과 $r_2$이 복소근이거나 중근($r_1 = r_2$)인 경우도 있을 것이다. 이 때엔 생각 없이 우와 일반해다~ 하고 식에 넣으면 지수에 허수가 붙거나 두 해가 선형종속이 되어버리는 끔찍한 상황을 맞이할 것이다. 이 때엔 어떻게 해야 할 지 생각해보자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;복소근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Characteristic Equation의 해가 $r = \lambda \pm \mu i$라고 하자. 일단 원래 해가 $y = e^{rt}$ 꼴이라고 가정했으므로 대입을 해 보면 $y = e^{(\lambda \pm \mu i)t} = e^{\lambda t} \cdot e^{\pm \mu t i}$이다. 오일러의 공식 $e^{\theta i} = \cos \theta + i \sin \theta$에서 $e^{\lambda t} \cdot e^{\pm \mu t i} = e^{\lambda t}(\cos \pm\mu t + i \sin \pm\mu t) = e^{\lambda t}(\cos \mu t \pm i \sin \mu t)$라고 할 수 있고, 실수부 허수부 따로 정리하면 $e^{\lambda t}\cos \mu t \pm i e^{\lambda t} \sin\mu t$이다.&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;여기서 실수부 허수부(의 일부)를 문자로 치환해서 $y = e^{\lambda t}\cos \mu t \pm i e^{\lambda t} \sin\mu t = R \pm Ii$라고 하자. $R \pm Ii$는 처음 미방의 해이기 때문에 $L[R \pm Ii] = 0$이라고 할 수 있다. Linear DE니까 $L$도 선형 연산자가 되기 때문에 다 분해해서 $L[R] \pm iL[I] = 0$라고 할 수 있고, DE의 계수가 다 실수, $R, I$도 다 실수이기 때문에 $L[R], L[I]$도 실수이다. $L[R] \pm iL[I] = 0$이려면 $L[R] = \mp iL[I]$이거나 $L[R] = L[I] = 0$이면 되는데, 전자는 $L[R]$이 실수니 불가능하고, 후자의 경우만이 가능함을 알 수 있다. $L[R] = L[I] = 0$이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 $L[R] = 0, L[I] = 0$, 그러니까 $R = e^{\lambda t}\cos \mu t$와 $I = e^{\lambda t} \sin\mu t$ 둘 다 미분방정식의 해가 된다는 것을 알 수 있다. 그러면 $c_1R + c_2I$가 일반해가 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;중근&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Characteristic Equation의 $\Delta = b^2 - 4ac = 0$이 되었으므로 근의 공식에서 $\displaystyle r = \frac{-b}{2a}$임을 알 수 있다. 그러니까 DE의 해 하나는 구한 것이다. $y_1 = e^{rt} = e^{-bt / 2a}$가 한 해다. 일반해를 얻기 위해서는 $y_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;여기에서 어떤 시도를 해볼 수 있다. $t$에 대한 함수 $d(t)$가 있어서 $y_1$과 선형 독립인 다른 해 $y_2 = d(t)y_1$가 된다고 하자. 임의의 $t$에 대한 함수 $d(t)$에 대해 $d(t)y_1$은 $t$에 대한 모든 함수를 나타내기 때문에 나쁠 것 없는 시도다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 $y_2 = dy_1$을 미방에 대입해 볼 수 있다. 그러면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ay_2''&amp;nbsp;+&amp;nbsp;by_2'&amp;nbsp;+&amp;nbsp;cy_2&amp;nbsp;=&amp;nbsp;0$$ &lt;br /&gt;$$a(dy_1)''&amp;nbsp;+&amp;nbsp;b(dy_1)'&amp;nbsp;+&amp;nbsp;c(dy_1)&amp;nbsp;=&amp;nbsp;0$$ &lt;br /&gt;$$a(d''y_1&amp;nbsp;+&amp;nbsp;2d'y_1'&amp;nbsp;+&amp;nbsp;dy_1'')&amp;nbsp;+&amp;nbsp;b(d'y_1&amp;nbsp;+&amp;nbsp;dy_1')&amp;nbsp;+&amp;nbsp;c(dy_1)&amp;nbsp;=&amp;nbsp;0$$ &lt;br /&gt;이다.&amp;nbsp;여기서&amp;nbsp;좌변을&amp;nbsp;$d$에&amp;nbsp;대해&amp;nbsp;정리하면 &lt;br /&gt;$$d''ay_1&amp;nbsp;+&amp;nbsp;d'(2ay_1'&amp;nbsp;+&amp;nbsp;by_1)&amp;nbsp;+&amp;nbsp;d(y_1''&amp;nbsp;+&amp;nbsp;by_1'&amp;nbsp;+&amp;nbsp;cy_1)&amp;nbsp;=&amp;nbsp;0$$ &lt;br /&gt;을&amp;nbsp;얻는다.&amp;nbsp;여기서&amp;nbsp;$d$의&amp;nbsp;계수&amp;nbsp;$y_1''&amp;nbsp;+&amp;nbsp;by_1'&amp;nbsp;+&amp;nbsp;cy_1&amp;nbsp;=&amp;nbsp;Ly_1&amp;nbsp;=&amp;nbsp;0$이므로&amp;nbsp;쟤는&amp;nbsp;없애버리면 &lt;br /&gt;$$d''ay_1&amp;nbsp;+&amp;nbsp;d'(2ay_1'&amp;nbsp;+&amp;nbsp;by_1)&amp;nbsp;=&amp;nbsp;0$$ &lt;br /&gt;이&amp;nbsp;된다. &lt;br /&gt;우리는&amp;nbsp;$y_1&amp;nbsp;=&amp;nbsp;e^{-bt/2a}$임을&amp;nbsp;알고&amp;nbsp;있고,&amp;nbsp;$y_1'&amp;nbsp;=&amp;nbsp;\displaystyle&amp;nbsp;\frac{-b}{2a}&amp;nbsp;e^{-bt/2a}&amp;nbsp;=&amp;nbsp;\frac{-b}{2a}y_1$이라는&amp;nbsp;것을&amp;nbsp;안다.&amp;nbsp;여기서&amp;nbsp;$d'(t)$의&amp;nbsp;계수인&amp;nbsp;$2ay_1'&amp;nbsp;+&amp;nbsp;by_1&amp;nbsp;=&amp;nbsp;\displaystyle&amp;nbsp;2a&amp;nbsp;\cdot&amp;nbsp;\frac{-b}{2a}y_1&amp;nbsp;+&amp;nbsp;by_1&amp;nbsp;=&amp;nbsp;0$이고,&amp;nbsp;따라서&amp;nbsp;얘도&amp;nbsp;없애버릴&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;그러면 &lt;br /&gt;$$d''ay_1&amp;nbsp;=&amp;nbsp;0$$ &lt;br /&gt;이 된다. 그러면 $d'' = 0$인 $dy_1$이 또 다른 해가 된다는 것인데... $\int 0 dt = C_1$, $\int C_1 dt= C_1t + C_2$니까 $d = C_1t + C_2$다. $y_2 = C_1ty_1 + C_2y_1$, 여기서 $y_1$과 종속인 항 떼고 상수 떼고 하면 $y_2 = ty_1$이라는 결론을 얻는다. 일반해는 $c_1y_1 + c_2y_2 = c_1y_1 + c_2ty_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;재미있는 것은 $dy_1 = y_2 = C_1ty_1 + C_2y_1$이 사실 일반해 꼴이었다는 것이다. 생각해보면 당연한데, $dy_1$은 $t$에 대한 모든 함수의 표현이기 때문에 저걸 만족하는 해를 찾았다는 것 자체가 미분방정식의 모든 해를 찾은 것이랑 같은 의미가 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reduction of Order&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따지면 위에서 한 번 했던 거랑 비슷한데 좀 제대로 잡고 이야기를 하자면, DE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$y'' + p(t)y' + q(t)y = 0$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가 있을 때, 여기서 한 해 $y_1$을 안다고 하면 아까 했던 것처럼 $y_2 = dy_1$로 두고 대입을 해 볼 수 있다. 정리까지 한 결과는 다음과 같이 된다 (중간에 $d$ 항은 계수가 $Ly_1$이 되어서 날아가버렸다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$d''y_1 + d'(2y_1 + py_1) = 0$$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 새롭게 만들어진 이 미방은 $d'$에 대한 1st linear DE다. 미분방정식의 차수가 하나 내려간 거다. 이걸 reduction of order 방법이라고 한댄다.&lt;/p&gt;</description>
      <category>수학</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/60</guid>
      <comments>https://safepost.tistory.com/entry/%EB%AF%B8%EB%B6%84%EB%B0%A9%EC%A0%95%EC%8B%9D-%EC%83%81%EC%88%98-%EA%B3%84%EC%88%98-Linear-Homogeneous-DE%EC%99%80-Characteristic-Equation#entry60comment</comments>
      <pubDate>Wed, 5 Oct 2022 20:28:40 +0900</pubDate>
    </item>
    <item>
      <title>[18806] 와일드 카드</title>
      <link>https://safepost.tistory.com/entry/18806-%EC%99%80%EC%9D%BC%EB%93%9C-%EC%B9%B4%EB%93%9C</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;부제: Wildcard string matching with Fast Fourier Transform&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제 분석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우선 지문을 읽어봅시다. 길이 25만의 알파벳 소문자 + '$?$' + '$*$'로 구성된 문자열이 두 개 들어옵니다. 문제에서 제시한 조작으로 두 문자열이 '같도록' 하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;문제에서 제시한 조작(연산)은 세 가지로, 문자 삽입, 문자 삭제, 문자 치환입니다. 그런데 사실 연산이 셋이나 있을 필요가 없습니다. 그 이유는 문자 '$*$'의 성질 때문인데, 이 녀석은 모든 문자이면서 모든 문자열로 취급될 수 있기 때문에 '치환'과 '삽입'의 역할을 대체할 수 있고, 길이가 0인 문자열로 취급될 수도 있기 때문에 '삭제'의 역할을 대체할 수 있습니다. 따라서 가용 연산을 다음과 같이 간단하게, 다시 적어도 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열의 임의의 위치에 있는 문자를 '$*$'로 대체한다.&lt;/li&gt;
&lt;li&gt;문자열의 임의의 위치에 '$*$'을 추가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이거면 끝입니다. 증명은 독자에게 맡깁니다&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;$S$와 $T$가 뭐 어떻게 들어오든 문자열 둘을 &lt;b&gt;단 2회의 연산으로&lt;/b&gt; 같게 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$S$의 왼쪽과 $T$의 오른쪽에 $*$를 붙입시다($S$의 왼쪽에 $*$를 붙여도 됩니다. 그럼 $T$의 오른쪽에 $*$을 붙입니다). 그러면 $*S, T*$가 되는데, $S$의 왼쪽 $*$를 $T$로 대체하고 $T$의 오른쪽 $*$를 $S$로 대체하면 $TS, TS$가 되어 두 문자열은 같아집니다. 이제 우리가 코딩할 프로그램의 출력은 $0, 1,$ 아니면 $2$뿐이란 사실을 알게 되었습니다. 모든 경우에서 적어도 $2$번만 연산을 하면 두 문자열이 같아진다는데, $3$번 $4$번 $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;그런데 생각해 보니 어떤 경우에는 $S$나 $T$의 서로 반대 끝에 $*$가 이미 붙은 입력이 들어올 수 있습니다. 그런 경우엔 모두 추가로 건드릴 필요 없이 답이 $0$입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;$S$와 $T$의 맨 오른쪽, 왼쪽 문자만 적어 보면 이런 꼴들입니다 (저렇게 $2\times 2$ 행렬로 계속 적겠습니다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$\begin{pmatrix}S_l &amp;amp; S_r \\\ T_l &amp;amp; T_r\end{pmatrix} = \begin{pmatrix}* &amp;amp; ? \\\ ? &amp;amp; *\end{pmatrix}$ $\begin{pmatrix}? &amp;amp; * \\\ * &amp;amp; ?\end{pmatrix}$ $\begin{pmatrix}* &amp;amp; * \\\ ? &amp;amp; *\end{pmatrix}$ $\begin{pmatrix}* &amp;amp; ? \\\ * &amp;amp; *\end{pmatrix}$ $\begin{pmatrix}* &amp;amp; * \\\ * &amp;amp; ?\end{pmatrix}$ $\begin{pmatrix}? &amp;amp; * \\\ * &amp;amp; *\end{pmatrix}$ $\begin{pmatrix}* &amp;amp; * \\\ * &amp;amp; *\end{pmatrix}$&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;어차피 왼쪽 오른쪽 끝 문자 두개씩 해서 4개만 갖고 경우 나누기 시작한 거, 나머지 경우도 다 따져봅시다. 위에서 적지 않은 경우는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0개: $\begin{pmatrix}? &amp;amp; ? \\\ ? &amp;amp; ?\end{pmatrix}$&lt;/li&gt;
&lt;li&gt;&lt;span&gt;1개:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;$\begin{pmatrix}* &amp;amp; ? \\\ ? &amp;amp; ?\end{pmatrix}$ $\begin{pmatrix}? &amp;amp; * \\\ ? &amp;amp; ?\end{pmatrix}$ $\begin{pmatrix}? &amp;amp; ? \\\ * &amp;amp; ?\end{pmatrix}$ $\begin{pmatrix}? &amp;amp; ? \\\ ? &amp;amp; *\end{pmatrix}$&lt;/li&gt;
&lt;li&gt;&lt;span&gt;2개(가로):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;$\begin{pmatrix}* &amp;amp; * \\\ ? &amp;amp; ?\end{pmatrix}$ $\begin{pmatrix}? &amp;amp; ? \\\ * &amp;amp; *\end{pmatrix}$&lt;/li&gt;
&lt;li&gt;&lt;span&gt;2개(세로):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;$\begin{pmatrix}* &amp;amp; ? \\\ * &amp;amp; ?\end{pmatrix}$ $\begin{pmatrix}? &amp;amp; * \\\ ? &amp;amp; *\end{pmatrix}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;어차피 풀이 해설 비슷하게 적고 있는 글이지만 위 경우에 어떤 값을 내야 하는지 모두 적지는 않겠습니다. 그걸 찾는 것도 또 나름의 재미가 있잖아요. 각 경우에서 '무슨 짓을 해야 둘을 같게 만들까?', 아니면 '무슨 짓을 해도 추가로 문자열을 조작하지 않으면 둘이 같을 수 없는 이유는 무엇일까?' 를 생각하면 좋습니다. 단 이제 중요한 것이 '$*$ 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;&amp;nbsp;$S = *f_0*f_1*...*f_{n-2}*f_{n-1}*$ 의 꼴($f$은 전부 문자열)이라고 합시다. 만약 $T$에 $*$이 한 개 이상 포함되어 있다면 $T$는 다음과 같이 표현할 수 있습니다: $T = T_l*T_r$. 그러면 $T$의 가운데 $*$을 $f_0*f_1*...*f_{n-2}*f_{n-1}$로 변환할 수 있고, $S$의 왼쪽과 오른쪽 $*$을 $T_l, T_r$로 변환할 수 있으므로 둘은 같게 됩니다. 그러니까 이 경우는 제하고 $T$에 $*$이 한 개도 없는 상황을 생각합시다. $S = *f_0*f_1*...*f_{n-2}*f_{n-1}*$ 와 $*$ 와일드카드 없는 $T$, 둘을 어떻게 다루어야 할까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 경우에서 나올 수 있는 답은 $0$ 혹은 $1$입니다. $T$의 맨 오른쪽에 $*$을 붙여버리면 앞에서 다룬 $\begin{pmatrix}* &amp;amp; * \\\ * &amp;amp; ?\end{pmatrix}$ 꼴이 되므로 바로 해결되고, 이 말은 즉 &lt;span&gt;'$*$ 2개(가로)'&lt;span&gt; 형태는 1회 이하의 조작으로 두 문자열을 같게 할 수 있다는 뜻입니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;경우의 수가 두 개 뿐입니다. 만약 두 문자열이 같다면 조작 횟수 0일 테고, 다르면 무조건 1입니다. 그러니까 두 문자열이 같은지 판별만 하면 되는 경우라는 뜻입니다 (이 수많은 경우들 사이에 판별을 하나 딱 끼워넣은 출제자가 존경스러워지는 순간입니다).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;두 문자열을 매칭할 적에는 '*' 와일드카드를 특별히 다룬다거나 할 필요가 없습니다. $S$가 특별히 좋은 꼴을 하고 있기 때문인데 ($*f_0*f_1*...*f_{n-2}*f_{n-1}*$), 와일드카드 사이에 끼어있는 $f_n$들을 $T$에 그냥 뜨문뜨문 매칭해버리고 $f_n$이 매칭되지 않은 빈 공간은 와일드카드 하나와 딱 매칭시켜버리면 모든 매칭이 끝납니다. 대신 $T$와 $f_n$이 매칭된 인덱스는 $f_n$의 인덱스(아래 첨자) 순서와 딱 맞게 매칭되어야 합니다. 다시 말하자면, $f_n$이 $T$와 매칭된 인덱스를 $m_n$이라고 할 때 $i &amp;lt; j$라면 $m_i &amp;lt; m_j$여야 한다는 뜻입니다.&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;&amp;nbsp;뭘 해야 하는지는 알았고, 어떻게 해야 하는지 생각할 차례입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문자열 매칭&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 매칭을 해야 하는데 문제는 여기 와일드카드가 있습니다. 그냥 문자열 매칭이라고 한다면 해싱이나 KMP를 쓰면 되겠지만 해싱은 우선 와일드카드 문자가 들어간 상황에서 안 되고, KMP는 failure function의 효율성이 와일드카드 때문에 개판이 나서 $O(NM)$ 매칭으로 되돌아갑니다. 그 때 구세주처럼 FFT가 등장합니다. FFT로 문자열 매칭을 어떻게 하냐고요? 아이디어는 다음과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우선 각 소문자 알파벳 a~z를 서로 다른 자연수에 매칭합니다. 그리고 와일드카드 문자 '$?$'는 0으로 둡니다. 두 문자열 $S, T$에 대해서 두 문자 $S[i]$와 $T[i]$를 비교할 때, $S[i]T[i](S[i]-T[i])^2$가 0이면 서로 같고, 0이 아니면 서로 다르다고 할 수 있을 것입니다. 둘 중 하나만 '$?$' == 0이어도 값은 0이 되고, 둘이 같다면 $S[i]-T[i]$가 0이 될 테니까요. 저걸 모든 문자열에 대해서 수행하고 그 결과를 다 더해서 0이 나오면 전체 문자열은 같다고 할 수 있겠죠 (두 문자열의 차를 제곱한 이유가 여기 있습니다. 제곱을 안 하면 어쩌다 차가 상쇄돼서 문자열이 다른데 0인 경우가 생깁니다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그래서 식을 다시 써보면 $\sum S[i]T[i](S[i]-T[i])^2 = \sum S[i]^3T[i] - 2\sum S[i]^2T[i]^2 + \sum S[i]T^3[i]$인데, 수열 $\{a_i\}, \{b_i\}$에 대해서 $\sum a_ib_i$는 FFT로 계산할 수 있죠? 합성곱 꼴에서 한쪽을 반전시키면 되잖아요. ($\sum a_i b_{n-i+1} \to \sum a_i b^{\text{reversed}}_i$). FFT 3번 때리면 매칭된 위치를 구할 수 있겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;더 효율적인 검색&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력으로 들어오는 두 문자열의 최대 길이는 25만입니다. 만약 $S$가 $(*\ *)$ 꼴이고 $T$에 '$*$' 문자가 하나도 없다면 길이 $|T|$짜리 FFT를 최대 $124999\times 3$번 때려야 합니다. $S = *a*a*a*a*...*a*a*a*$인 경우라면요. 그러니까 위에서 설명한 FFT 검색을 무작정 구현해서 넣었다간 큰일납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;지금의 FFT 검색은 처음부터 끝까지 모든 매칭을 탐색합니다. 문제를 풀기 위해 얻어야 하는 것은 해당 패턴이 존재하는 첫 번째 위치이지 모든 위치가 아니기 때문에, 탐색을 앞에서부터 순차적으로 하다가 딱 매칭이 되면 그 패턴으로 검색을 멈추었으면 좋겠습니다. 탐색 구간을 자르면 이러한 구현이 가능합니다. 문자열 $T$에서 패턴 $p$로 검색을 한다 치면 index $0$부터 $|p|-1$까지, $|p|$부터 $2|p|-1$까지... 이렇게 검색하면 패턴 길이까지 더해서 길이 $2|p| -1$짜리 FFT를 여러 번 시행하는 것으로 계산을 줄일 수 있습니다.&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;그렇게 길고 긴 구현을 하면 AC를 받습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1662522290483&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;18806번: 와일드 카드&quot; data-og-description=&quot;첫째 줄에 문자열 S가, 둘째 줄에 문자열&amp;nbsp;T가 주어진다. (1&amp;nbsp;&amp;le; |S|, |T| &amp;le; 250,000)&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/18806&quot; data-og-url=&quot;https://www.acmicpc.net/problem/18806&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/btGhgC/hyPIGiGR3w/frhKS1YPKioV9scK5UCE7K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18806&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/18806&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/btGhgC/hyPIGiGR3w/frhKS1YPKioV9scK5UCE7K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;18806번: 와일드 카드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 문자열 S가, 둘째 줄에 문자열&amp;nbsp;T가 주어진다. (1&amp;nbsp;&amp;le; |S|, |T| &amp;le; 250,000)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PS | CP/Baekjoon OJ</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/51</guid>
      <comments>https://safepost.tistory.com/entry/18806-%EC%99%80%EC%9D%BC%EB%93%9C-%EC%B9%B4%EB%93%9C#entry51comment</comments>
      <pubDate>Wed, 14 Sep 2022 15:22:31 +0900</pubDate>
    </item>
    <item>
      <title>[19499] K-transform</title>
      <link>https://safepost.tistory.com/entry/19499-K-transform</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;거꾸로 생각합시다. k-transform으로 만들어지는 수는 $k(k(k(...(k(1+a_0)+a_1)...+a_{n-1}) + a_n$의 꼴($0 \leq a_n &amp;lt; k, a_0 \neq k-1$)이고, 여기서 $\sum_{i=0}^na_i + n = m$이 됩니다. 저걸 전개해버리면 $(1+a_0)k^n + a_1k^{n-1} + ... + a_{n-1}k + a_n$입니다. 이걸 $k$진 수로 생각하면 $(1+a_0)a_1a_2a_3...a_{n-1}a_{n\ (k)}$, 그러니까 $\text{digit sum} + \text{digit}-1 = m$인 모든 $k$진 수의 개수를 구하는 문제가 됩니다.&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;&amp;nbsp;쉽지 않네요... 그렇죠? 애초에 제약 없이 수를 나누는 문제도 중복조합으로 풀어야 하는데... 제약이 더 걸려있으니 까다롭지요.&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;어떤 $k$진 수 $N$의 첫번째 자리 수, 그러니까 $N \text{ mod } k$가 $0$인 경우, $1$인 경우, $2$인 경우... $k-1$인 경우로 나눠 봅시다. 이 때 $N$의 $\text{digit sum}$이 $s$라면:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$N \equiv 0 \mod{k}$인 경우는 모든 $\text{digit sum} = s$인 $k$진 수에 각각 $k$를 곱해서 만들 수 있고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$N \equiv 1 \mod{k}$인 경우는 모든 $\text{digit sum} = s-1$인 $k$진 수에 각각 $k$를 곱한 뒤 $1$을 더해서 만들 수 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그렇게 생각하면 $\text{digit sum} = s, s-1, ..., s-k$인 모든 경우를 다 더해서 $\text{digit sum} = s$인 경우를 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그런데 이건 원래 구하려고 했던 게 아니잖아요? 자릿수도 고려대상에 넣어야 하잖아요? $k$를 곱한다는 것은 연산을 하나 소모하는 거고... 그럴 거면 애초에 $\text{digit sum}$이 아니고 $\text{digit sum} + \text{digit} - 1$(앞으로 $x$로 줄여 부를게요)을 가지고 뭘 해야겠죠.&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;&amp;nbsp;또 다시 어떤 $k$진 수 $N$의 $\text{mod }k$ 값을 가지고 경우를 나눠 봅시다. $N \equiv 0 \mod{k}$인 경우는 모든 $x = s - 1$인 $k$진 수에 $k$를 곱해서 만들 수 있습니다. $N\equiv 1 \mod{k}$는 $x=s-2$인 경우에 $k$ 곱하고 $1$ 더해서... 그렇게 $k-1$을 더하는 경우까지 가면 $x$가 $s-1$부터 $s-k$인 경우까지 쭉 더하면 $x=s$인 모든 경우의 수가 나온다는 걸 알 수 있습니다. 보기 편하게 정리할까요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;$k$는 그냥 상수로 두고, $C_s$를 $x = s$인 모든 $k$진 수의 개수라고 합시다. 그럼 $C_s = C_{s-1}+ ... + C_{s-k}$가 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이전 $k$개의 항으로 결정되는 선형 점화식을 얻었습니다. 이제 키타마사법을 적용하면 $C_{m}$의 값을 $O(k^2\log{m})$에 구할 수 있습니다. 시간 초과도 받을 수 있습니다. $K^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;&amp;nbsp;키타마사를 돌릴 적에, 다항식 나눗셈에 대한 추가적인 최적화가 가능합니다. 이게 점화식의 계수가 다 같아서 할 수 있는 짓인데, 다항식 $C_k - \sum_{i=0}^{k-1} C_{i}$으로 다른 다항식을 나눌 때를 잘 관찰해 보면 연속적인 구간에 다 같은 값을 더하는 짓을 반복합니다. 여기에 레이지 세그를 먹이면 $K \log K$에 다항식 나머지를 구하는 짓이 가능해집니다.&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;&amp;nbsp;근데 $C_{0}$ ~ $C_{k-1}$을 구해야 &lt;span&gt;키타마사를 돌리겠죠? 저건 잘 모르겠으니 냅다 나열해봅시다. 우선 편의상 $k$가 충분히 큰 임의의 자연수라고 합시다. 한 100이면 괜찮을까요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;$C_0 = 1$입니다. $1$이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$C_1 = 2$입니다. $k, 2$가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$C_2 = 4$입니다. $k^2, k+1, 2k, 3$이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$C_3 = 8$입니다. $k^3, k^2+1, 2k^2, k(k+1), k+2, 2k+1, 3k, 4$이 있습니다.&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;&amp;nbsp;딱 감이 오죠? 이거 $C_n = 2^n\ (n &amp;lt; k - 1)$입니다. 애초에 모든 경우에서 두 갈래로($\times k$, $+1$) 뻗어나갈 수 있는데 최종 겹치는 경우는 하나도 없으니깐 성립합니다. 그러다가 1에서 $+1$로만 뻗은 가지가 $k$를 건드리면 끝납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;$C_{k-1}$은 1에서 $+1$로만 뻗은 녀석이 $k$에 다다르기 때문에 그 경우만 빼 주면 되어서 $2^{k-1}-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;&amp;nbsp;아무래도 정해는 &lt;a title=&quot;Bostan-Mori 알고리즘&quot; href=&quot;https://arxiv.org/abs/2008.08822&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Bostan-Mori 알고리즘&lt;/a&gt;인 것 같습니다. 언젠가 읽어봐야겠습니다.&lt;/p&gt;
&lt;figure id=&quot;og_1662977348504&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;19499번: K-transform&quot; data-og-description=&quot;The first line contains three integers separated by spaces: $k$, $m$, $\mathit{mod}$ ($2 \le k \le 10^{4}$, $0 \le m \le 10^{18}$, $2 \le \mathit{mod} &amp;lt; 300$). It is guaranteed that $\mathit{mod}$ is prime.&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/19499&quot; data-og-url=&quot;https://www.acmicpc.net/problem/19499&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nQxmO/hyPLqUImAZ/90fHkHtILEVYxcA3ZD232K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/19499&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/19499&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nQxmO/hyPLqUImAZ/90fHkHtILEVYxcA3ZD232K/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;19499번: K-transform&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The first line contains three integers separated by spaces: $k$, $m$, $\mathit{mod}$ ($2 \le k \le 10^{4}$, $0 \le m \le 10^{18}$, $2 \le \mathit{mod} &amp;lt; 300$). It is guaranteed that $\mathit{mod}$ is prime.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PS | CP/Baekjoon OJ</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/50</guid>
      <comments>https://safepost.tistory.com/entry/19499-K-transform#entry50comment</comments>
      <pubDate>Mon, 12 Sep 2022 23:51:01 +0900</pubDate>
    </item>
    <item>
      <title>[18968] Circle Union</title>
      <link>https://safepost.tistory.com/entry/18968-Circle-Union</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아마 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;&amp;nbsp;covered region을 최대화하려면 각 원이 모두 한 점에만 만나야 한다. 그러니까 모든 원(과 원 안의 부분)을 이루는 점의 집합의 교집합의 원소가 정확히 한 개여야 한다는 것이다. 그렇지 않은 경우엔 원 하나를 적절히 움직여서 더 넓은 covered region을 갖는 형태로 만들 수 있다. 그러면 원점을 지나는 원들의 형태를 다루는 문제가 된다. 정확히는 형태라기보다는 원의 중심이 존재하는 위치? 각도? 그런 것이다.&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;&amp;nbsp;이제 문제 상황을 좀 편하게 다루기 위해 도형을 극좌표계로 펼쳐 보자. 극좌표계에서 원점을 지나고 반지름이 $R$인 원은 $r = 2R\cos(\theta - a)$ 꼴로 표현된다. 여기서 $a$는 원이 원점 기준 반시계 방향으로 회전한 각도이다. 그러면 우리가 다루는 모든 원이 $\theta - r$ 평면에 그려진, 코사인 그래프의 $-\pi /2 ~ \pi /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;&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;코사인 부분 세 개가 나란히 있다고 하자. 양 끝의 코사인 부분은 고정되어 있을 때 가운데 코사인 부분을 어떻게 두어야 셋의 부분 넓이를 가장 크게 만들 수 있을까 생각하면, 왼쪽 부분 가운데 부분이 만나는 점의 $r$값과 가운데 부분 오른쪽 부분이 만나는 점의 $r$값이 같도록 하면 된다는 것을 알 수 있다. 이유는 다음과 같은데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. 가운데 코사인 부분을 위에서 말한 대로 배치한 뒤의 양 교점 $r$값이 $R_0$이라고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. 이제 가운데 코사인 부분을 $\text{d}\theta$만큼 아주아주아주 살짝 오른쪽으로 옮긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3. 오른쪽 부분과 만나는 $r$값이 $R_r$, 왼쪽 부분 값이 $R_l$로 바뀌었다고 하자. 그러면 충분히 작은 $\text{d}\theta$값에 대해 오른쪽 부분과 더 겹치게 된 넓이는 $\text{d}\theta \cdot (R_0+R_r)/2$, 왼쪽 부분과 안 겹치게 된 넓이는 $\text{d}\theta \cdot (R_0+R_l)/2$이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4. 그러면 전체 넓이는 안 겹치게 된 넓이 - 더 겹치게 된 넓이$ = \text{d}\theta \cdot \{(R_0+R_l)/2 - (R_0+R_r)/2\} = \text{d}\theta \cdot (R_l - R_r)/2$만큼 변화한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;5. 여기서&amp;nbsp;$R_l&amp;nbsp;-&amp;nbsp;R_r$의&amp;nbsp;부호를&amp;nbsp;생각해&amp;nbsp;보자.&amp;nbsp;오른쪽&amp;nbsp;부분과&amp;nbsp;가운데&amp;nbsp;부분이&amp;nbsp;만나는&amp;nbsp;점이&amp;nbsp;왼쪽&amp;nbsp;부분과의&amp;nbsp;그것보다&amp;nbsp;가운데&amp;nbsp;부분의&amp;nbsp;봉우리에&amp;nbsp;더&amp;nbsp;가까이&amp;nbsp;있게&amp;nbsp;되기&amp;nbsp;때문에&amp;nbsp;$R_r$이&amp;nbsp;$R_l$보다&amp;nbsp;더&amp;nbsp;크다.&amp;nbsp;&lt;b&gt;따라서 전체 넓이는 줄어든다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;6. 가운데 코사인 부분을 왼쪽으로 옮긴다고 해도 똑같은 결과가 나온다. 즉 원래의 상태가 최적의 상태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;7. 이게 직교좌표계에서 구한 넓이긴 한데 극좌표계에서 생각해도 결과는 다르지 않다. 어차피 직관으로 하는 거니까...&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;&amp;nbsp;1. a-b 교점의 높이와 b-c 교점의 높이를 같도록 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. b-c 교점의 높이와 c-d 교점의 높이를 같도록 해야 한다. 그러면 a-b높이 = b-c높이 = c-d높이.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3. c-d와 d-e -&amp;gt; a-b = b-c = c-d = d-e&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;&amp;nbsp;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;&amp;nbsp;그리고 이렇게 생각하면 원들을 늘어놓는 순서도 의미가 없는 것이 어차피 일정 높이까지는 다 같이 겹치는 것이고 그 위의 부분들은 모두 겹치지 않기 때문에 똑 떼서 순서를 바꾼들 넓이에는 영향이 없다.&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;&amp;nbsp;이제 높이 하나를 정하면 그걸로 코사인들 쭉 이어걸어서 넓이를 구할 수 있다. 정답 높이는 식 써서 찾아도 되고 그냥 이분 탐색 때려도 나온다.&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/18968&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/18968&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654691404691&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;18968번: Circle Union&quot; data-og-description=&quot;An arrangement of several circles in the plane is interesting&amp;nbsp;if there exists a point that lies inside or on the boundary of each circle. The covered region&amp;nbsp;of an arrangement consists of all points that lie inside or on the boundary of at least one of th&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/18968&quot; data-og-url=&quot;https://www.acmicpc.net/problem/18968&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLPgwY/hyOGWHOi1g/A4N2BzUceKL9RDuKc1zGYk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18968&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/18968&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLPgwY/hyOGWHOi1g/A4N2BzUceKL9RDuKc1zGYk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;18968번: Circle Union&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An arrangement of several circles in the plane is interesting&amp;nbsp;if there exists a point that lies inside or on the boundary of each circle. The covered region&amp;nbsp;of an arrangement consists of all points that lie inside or on the boundary of at least one of th&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PS | CP/Baekjoon OJ</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/47</guid>
      <comments>https://safepost.tistory.com/entry/18968-Circle-Union#entry47comment</comments>
      <pubDate>Sun, 21 Aug 2022 00:46:55 +0900</pubDate>
    </item>
    <item>
      <title>수강 신청에 성공하고 싶다면: 서버 시간 ms 단위 동기화</title>
      <link>https://safepost.tistory.com/entry/%EC%88%98%EA%B0%95-%EC%8B%A0%EC%B2%AD%EC%97%90-%EC%84%B1%EA%B3%B5%ED%95%98%EA%B3%A0-%EC%8B%B6%EB%8B%A4%EB%A9%B4-%EC%84%9C%EB%B2%84-%EC%8B%9C%EA%B0%84-ms-%EB%8B%A8%EC%9C%84-%EB%8F%99%EA%B8%B0%ED%99%94</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;수강 신청&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;대학교 한 학기를 결정짓는 수강신청은 항상 긴장되기 마련입니다. 그러니 여러분은 어떻게 하면 수강신청에 실패하지 않을까 생각할 것입니다. 보통은 PC방을 가서 수강신청을 하거나&amp;nbsp;&lt;span&gt;네이비즘과 같은 서버 시간 사이트를&lt;/span&gt;&amp;nbsp;씁니다.&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;수강신청을 위해 PC방을 가는 건 조금 이상합니다. PC방의 컴퓨터 환경이 집의 컴퓨터 환경보다 쾌적할 것은 분명하지만 좋은 컴퓨터 환경이 수강신청의 성공에 주는 영향은 아주 미미합니다. 그마저도 PC방 컴퓨터에서 집 컴퓨터에 비해 얻을 수 있는 몇 ms의 이득은 집에서 손가락 몇 ms 더 빠르게 놀리는 것으로 대체될 수 있고요 (물론 집에 컴퓨터가 없거나 아주 아주 아주 저열한 사양의 컴퓨터만 있다면 어쩔 수 없지만요). 패킷 전송 속도의 측면에서도 집의 인터넷 환경이 특별히 안 좋은 게 아니라면 큰 차이도 나지 않습니다. $^1$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;네이비즘의 경우에는... KRISS에서 제공하는 UTCk3 시계와 비교했을 때 네이비즘 창을 여러 번 새로고침하자 UTCk3 시계보다 빠른 시간을 표시했다가, 더 느린 시간을 표시했다가 하며 바뀌는 모습을 보였습니다. 네이비즘에서 제공하는 정보가 정확한지도 알 수 없고, 네이비즘 서버에서는 제대로 된 정보를 제공했다고 하더라도 브라우저가 제대로 표시하지 못할 수도 있습니다. 둘 다 네이비즘 사이트에 표시되는 정보를 신뢰하기 어렵다는 의미가 되겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;돌아와서, 수강신청을 할 때 중요한 요소가 무엇이냐 하면 두 가지로 추측하는데 '버튼을 누르는 시점 (이하 $T_p$)' 과 '브라우저의 입력 정보가 서버에 도달할 때까지 걸리는 시간 (이하 $T_{c\to s}$)' 입니다. 이 때 목표는 $T_p + T_{c\to s} - (10:00)$을 최대한 작은 양의 값으로 만드는 것입니다 (음의 값이 되면 망합니다).&lt;br /&gt;&amp;nbsp;문제는 여기서 $T_p$를 판정하는 주체가 학교 서버라는 겁니다. 제가 다니고 있는 대학교는 따로 NTP 서버를 열어주지 않았기 때문에 서버에서 기준으로 사용하는 시간을 받아오기가 참 곤란합니다. 이럴 때는 어떻게 해야 할까요?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;HTTP 헤더의 &quot;Date&quot;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uuad3/btrJ4cIfpq1/0V8ZYjGDwyhespEKYsJKl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uuad3/btrJ4cIfpq1/0V8ZYjGDwyhespEKYsJKl0/img.png&quot; data-alt=&quot;Response Headers -&amp;amp;gt; Date에 서버 시간이 나타난 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uuad3/btrJ4cIfpq1/0V8ZYjGDwyhespEKYsJKl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuuad3%2FbtrJ4cIfpq1%2F0V8ZYjGDwyhespEKYsJKl0%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;402&quot; height=&quot;208&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Response Headers -&amp;gt; Date에 서버 시간이 나타난 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;일단 수강신청은 해야 하니까 수강신청 서버는 HTTP 통신을 합니다. HTTP의 응답 헤더(Response Header)에는 서버가 요청에 응답한 시점의 시간이 &quot;Date&quot;에 나타납니다. 문제는 그 정밀도인데, 초 단위까지만 표시되어 있습니다. 몇 밀리세컨드에서 응답했는지 이 데이터만으로는 알 수 없다는 겁니다. 일분 일초 일밀리초가 급한 수강신청 상황에서 최대 1초의 오차는 치명적입니다. 밀리초를 알아낼 방법은 없는 걸까요? 물론 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;현재 내 컴퓨터(클라이언트)의 시간을 $T_c$, 서버의 시간을 $T_s$라고 합시다. 또 편의를 위해 $T_{c \to s}$는 항상 1보다 작다고 합시다. (물론 항상 작을 겁니다.) $T_c, T_s$만을 고려하면 ($T_{c \to s}$은 상수로 둡니다) &quot;Date&quot;가 나타내는 시간은 ${\lfloor T_s + T_{c \to s}\rfloor}$입니다. 즉 ${\lfloor T_s + T_{c \to s}\rfloor} \leq T_s &amp;lt; {\lfloor T_s + T_{c \to s}\rfloor} + 1$임을 알 수 있고 여기서부터 탐색을 시작할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;$T_s - T_c \in [a, b)$임을 안 상황에서 새로운 정보 $T_s - T_c \in [x, x + 1)$이 들어왔다면&amp;nbsp; $T_s - T_c \in [a, b) \cap [x, x + 1)$임을 알 수 있지요. $T_s - T_c$의 값 범위는 $[{\lfloor T_s + T_{c \to s}\rfloor} - T_c, {\lfloor T_s + T_{c \to s}\rfloor} + 1 - T_c)$로 얻어지므로 다양한 시간대에서 범위를 얻어 교집합을 계속 구하다 보면 특정 값으로 좁혀질 겁니다. xx:020일 때, xy:040일 때, xz:060일 때... 처럼 밀리세컨드 값이 조금씩 다른 시간대에서 해보면 괜찮겠네요. 물론 interval은 너무 짧게 두지 않도록 합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;$T_{c \to s}$&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이제 서버와 싱크를 어느 정도 맞췄다면&amp;nbsp; $T_{c \to s}$를 구해 봅시다. 몇 가지 방법이 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ping 혹은 tracert&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ping을 쳐서 서버까지 패킷이 가는 데 걸리는 시간을 찾거나, ping이 막힌 경우 tracert를 통해 집에서 학교 서버 직전까지 걸리는 시간을 찾을 수 있습니다. 그 후 3way handshake에 얼마나 시간이 걸릴 지 예측해서 $T_{c \to s}$를 구하면 됩니다. 말은 쉬운데 저걸 어떻게 예측할지는 잘 모르겠습니다. 대충 3배 하면 되나요? 네트워크는 잘 몰라서요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;절묘한 $T_s$ 컨트롤&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$T_{c \to s}$은 상수로 치고, $T_s + T_{c \to s}$을 정수로 만드는 $T_s$를 어떻게든 찾으면 &quot;Date&quot;를 받아와 $T_{c \to s}$를 찾을 수 있습니다. $T_s$의 실수부를 0.995에서 살짝살짝 낮추면서 ${\lfloor T_s + T_{c \to s}\rfloor}$ 값이 기대한 값보다 1 작아지는 지점을 찾고 이걸로 $T_{c \to 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;근데 해봤더니 안되네요&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;직접 해보기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 설명한 대로 정보를 모으도록 코딩을 하고 결과를 봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$T_s - T_c = 44.344306ms$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$T_{c \to s} = 6.5ms$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다는데... 사실 $T_{c \to 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;이제 분석해봅시다. 서버 시간이 로컬 시간보다 44ms 빠릅니다. 이 말은 내 컴퓨터에서 0ms를 띄우면 서버는 44ms를 띄운다는 뜻입니다. 저는 10시 40ms쯤 전에 버튼을 누르면 거의 완벽한 수강신청이 가능하다는 뜻입니다....&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~20ms 정도로 크게 잡았으니까 40ms면 의미 있는 값도 아닌 것 같아서... 그냥 컴퓨터 시간 맞춰서 누르기로 했습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 학기 수강신청은 끝났고 내년 초에나 또 건드려 볼 주제&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$^1$ : &lt;a href=&quot;http://snaptime.edaily.co.kr/2019/08/%ED%8C%A9%ED%8A%B8%EC%B2%B4%ED%81%AC-%EB%8C%80%ED%95%99%EA%B5%90-%EC%9D%B8%EA%B7%BC-pc%EB%B0%A9-%EC%88%98%EA%B0%95%EC%8B%A0%EC%B2%AD-%EC%84%B1%EA%B3%B5-%ED%99%95%EB%A5%A0-%EB%8D%94-%EB%86%92/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://snaptime.edaily.co.kr/2019/08/%ED%8C%A9%ED%8A%B8%EC%B2%B4%ED%81%AC-%EB%8C%80%ED%95%99%EA%B5%90-%EC%9D%B8%EA%B7%BC-pc%EB%B0%A9-%EC%88%98%EA%B0%95%EC%8B%A0%EC%B2%AD-%EC%84%B1%EA%B3%B5-%ED%99%95%EB%A5%A0-%EB%8D%94-%EB%86%92/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>open</category>
      <category>MS</category>
      <category>동기화</category>
      <category>밀리초</category>
      <category>수강신청</category>
      <category>시간</category>
      <category>초</category>
      <category>티케팅</category>
      <category>티켓팅</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/46</guid>
      <comments>https://safepost.tistory.com/entry/%EC%88%98%EA%B0%95-%EC%8B%A0%EC%B2%AD%EC%97%90-%EC%84%B1%EA%B3%B5%ED%95%98%EA%B3%A0-%EC%8B%B6%EB%8B%A4%EB%A9%B4-%EC%84%9C%EB%B2%84-%EC%8B%9C%EA%B0%84-ms-%EB%8B%A8%EC%9C%84-%EB%8F%99%EA%B8%B0%ED%99%94#entry46comment</comments>
      <pubDate>Fri, 19 Aug 2022 04:15:17 +0900</pubDate>
    </item>
    <item>
      <title>[17399] 트리의 외심</title>
      <link>https://safepost.tistory.com/entry/17399-%ED%8A%B8%EB%A6%AC%EC%9D%98-%EC%99%B8%EC%8B%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 8에 속한 문제. sparse table, 혹은 LCA만 알고 있다면 간단한 케이스 분류로 쉽게 풀 수 있다.&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;한 트리 위의 노드 $a, b, c$를 생각하자. 두 노드 $x, y$에 대해 $x$에서 $y$로 가는 경로를 $P_{xy}$라고 적기로 하고, 이제 $P_{ab}, P_{bc}, P_{ac}$를 생각해 보자. 그럼 다음이 성립한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. $P_{ab}, P_{bc}, P_{ac}$는 항상 유일하게 존재한다. 왜냐? 트리니까. 한 노드에서 다른 노드로 가는 경로가 여러 개 있다는 건 사이클이 있다는 소린데 그럼 트리가 아님.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. 세 경로 $P_{ab}, P_{bc}, P_{ac}$에 모두 속해 있는 노드는 항상 한 개 이상 존재한다. 트리이기 때문. 만약 그런 노드가 없다면 $a \to b \to c \to a$ 사이클이 생기는데 그럼 트리가 아님.&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;&amp;nbsp;1. $a, b, c$를 모두 포함하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. 리프 노드가 3개 이하이고, 모든 리프 노드가 $a, b, c$ 중 하나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 만족하는 녀석이다. 이게 이렇게 설명하니까 잘 안 와닿는데, 대충 설명하자면 트리에서 $a, b, c$ 부분을 가위로 찰칵찰칵 잘라서 $a, b, c$ 모두를 포함하고 있는 덩어리를 집은 것이다 ($a, b, c$가 서로의 부모 노드가 아닌 경우에만 먹히는 설명인데, 만약 그걸 캐치했다면 나중에 예외 케이스를 생각해봐야겠구나 하고 계획을 잡을 수 있겠다).&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;&amp;nbsp;1. dot : 세 노드가 같은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. linear: 두 노드가 같고 한 노드가 다른 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3. bent: 세 노드가 모두 서로 다르고, 세 노드가 한 경로 위에 놓인 경우. formal하게 표현하자면, 서로 다른 세 노드 $a, b, c$에 대하여 $\exists i, j, k \in \{a, b, c\}, i \neq j \neq k \wedge k \in P_{ij}$를 만족.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4. trigonal: otherwise.&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;&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;&amp;nbsp;1. ㅋㅋ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2. 서로 다른 두 노드의 중점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;3. 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4. 이 경우를 구하는 게 핵심이라면 핵심이다. 우선 외심이 존재한다고 치고 얘를 $o$라고 부르자. 그러면 $P_{ao}$의 길이와 $P_{bo}, P_{co}$의 길이가 서로 다 같아야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;아까 전에 잠깐 했던 얘기를 다시 들고 오자. &lt;span&gt;세 경로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;$P_{ab}, P_{bc}, P_{ac}$에 동시에 속해 있는 노드는 항상 한 개 이상 존재한다고 했다. trigonal 구조의 경우 그 노드가 딱 하나밖에 없는데(트리의 구조를 떠올려 보자! 항상 '삼거리' 노드가 딱 하나만 존재한다), 이 노드를 $t$라고 부르자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$t$를 트리 위에서 움직여 $o$로 이동시키는 상황을 생각하자. 편의상 $t$와 $c$ 사이에 $o$가 있다고 하면, $t$를 $o$쪽으로 한 칸씩, $n$번 움직였을 때의 위치를 $t_n$이라고 했을 때&amp;nbsp;&lt;span&gt;$P_{at_n}, P_{bt_n}, P_{ct_n}$의 길이는 각각 $|P_{at}| + n, |P_{bt}| + n, |P_{ct}| - n$으로 표현할 수 있다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 $t_m$이 $o$와 같다고 하면, $|P_{at}| + m = |P_{bt}| + m = |P_{ct}| - m$이 성립하고, 따라서 $P_{at}$와 $P_{bt}$의 길이가 같아야 한다는 사실을 얻을 수 있다.&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;span&gt;$|P_{at}| = |P_{bt}|$라는 사실을 얻었는데, 하나 더 해야 한다. 앞에서 $t$와 $c$ 사이에 외심이 존재할 것으로 가정했기 때문에, 정말로 그런 상황인지를 알아야 하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 $|P_{at}| = |P_{bt}|$만으로 외심으로 의심되는 노드를 구할 수는 있다. 외심의 정의에 따라 $a$/$b$와 $c$의 거리상 가운데 노드를 잡으면 된다. 그러고 나서 그 노드가 진짜로 조건을 만족하는지 체크하면 끝.&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;이걸 무지성 parent-&amp;gt;parent-&amp;gt;parent 도배로 구현하면 TLE고, LCA를 적용하면 시간 안에 들어온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언제나 sparse table은 [log][N]인거 잊지 말기! (cache hit...)&lt;/p&gt;</description>
      <category>PS | CP/Baekjoon OJ</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/41</guid>
      <comments>https://safepost.tistory.com/entry/17399-%ED%8A%B8%EB%A6%AC%EC%9D%98-%EC%99%B8%EC%8B%AC#entry41comment</comments>
      <pubDate>Tue, 26 Apr 2022 17:47:06 +0900</pubDate>
    </item>
    <item>
      <title>[17378] 공의 합집합</title>
      <link>https://safepost.tistory.com/entry/17378-%EA%B3%B5%EC%9D%98-%ED%95%A9%EC%A7%91%ED%95%A9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;x축에 타코야끼마냥 중심을 꽂힌 다양한 크기의 구들이 있는데, 이 녀석들의 전체 부피를 구해야 한다. 그런데 서로 겹치는 경우가 생길 수 있기 때문에 그냥 구해서는 안 된다. 뭔가 방법을 써야 한다.&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;우선 3차원 상황을 그대로 써먹으려고 하면 불편하다. 어차피 문제 상황의 모든 도형이 x축을 중심으로 한 회전체 꼴이기 때문에 2차원 평면 위의 반원들로 차원을 낮추자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 공 $S_i = (x - x_i)^2 + y^2 + z^2 \leq r_i^2$들은 이제 $C_i = (x - x_i)^2 + y^2 \leq r_i^2\ (y \geq 0)$으로 생각하자. 그럼 부피는 간단하게 $\displaystyle \pi\int_{a}^{b} y^2dx = \pi\int_{a}^{b} \{r_i^2 - (x - x_i)^2\}dx$로 생각할 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 '필요 없는' 반원을 두 가지 케이스로 나눠볼 수 있다. 반원이 반원 하나에 딱 가려지는 경우와 두 개 이상의 반원들에 걸쳐서 가려지는 경우인데, 일단 첫 번째 경우는 스위핑으로 해결할 수 있다. 반원 자체를 보지 말고 차원을 그냥 1차원으로 냅다 낮춰버리자. 반원을 그냥 반원이 $x$축과 만나는 두 점으로 표현해버리는 것이다. 이제 그걸 잘 정렬해서 어떤 정보만 들고 한번 쓱 훑으면 첫 번째 케이스의 반원만 딱 골라낼 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 설명하기가 좀 그런데... 우선 반원들을 중심의 $x$좌표 순으로 정렬한다. 그리고 앞에서부터 리스트에서 인접한 두 반원의 교점을 차례차례 구해 나간다. 만약 어떤 시점에서 구한 교점과 그 다음 시점에서 구한 교점을 비교했을 때 다음에 구한 교점의 $x$좌표가 이전에 구한 교점의 $x$좌표보다 작거나 같다면 두 교점을 구할 때 공통적으로 들어간 그 반원을 리스트에서 제거한 후 이전 시점으로 돌아가 다시 계산을 진행한다.&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;이게 왜 되느냐? 만약 이전 시점에서 반원 $h_1, h_2$에 대해서 구한 교점의 $x$좌표가 2고 그 다음 시점에서 반원 $h_2, h_3$에 대해서 구한 교점의 $x$좌표가 1이라고 하자. 그럼 자명하게 $h_1$과 $h_3$의 교점이 $x=1$과 $x=2$ 사이에서 생기고, 그 교점의 $y$좌표는 해당 $x$에서 $h_2$의 $y$좌표보다 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 상황이 발생한다는 것 자체가 $h_2$의 $r$보다 $h_1$의 $r$, 혹은 $h_3$의 $r$이 더 크다는 의미니까 반원 $h_2$는 반원 $h_1$과 $h_3$에 완전히 묻혀버리는 거라 리스트에서 없애버리면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;그렇게 적분 구간을 다 구했으면 이제 적분을 하면 되는데 모듈러가 1e9+7로 소수니까 모듈러 역수와 모듈러 상에서의 곱셈 뭐 그런 것들 따져서 오버플로우 안 나게 잘 해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아니면 즐거운 python Fraction을 쓰든가... 근데 시간 2초 고정이라 파이썬 쓰면 TLE 나지 싶음. 아직 파이썬으로 푼 사람도 없고...&lt;/p&gt;
&lt;figure id=&quot;og_1650383168047&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;17378번: 공의 합집합&quot; data-og-description=&quot;3차원 좌표공간에 n개의 공(ball)이 있다. 이 중 i (1 &amp;le; i &amp;le; n)번째 공은 겉표면이 중심이 (xi, 0, 0)이고 반지름은 ri인 구 형태이며, 이 공이 차지하는 영역은 Si = {(x, y, z) &amp;isin; ℝ3 : (x - xi)2 + y2 + z2 &amp;le; ri&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17378&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17378&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjAjFl/hyN65qFFuS/RwN8lSEhkpzSFY4WfNP8Vk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/cYPjFl/hyN637rP23/R0KzV6GD7kjje4U2cKTX80/img.jpg?width=919&amp;amp;height=574&amp;amp;face=0_0_919_574&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17378&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17378&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjAjFl/hyN65qFFuS/RwN8lSEhkpzSFY4WfNP8Vk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480,https://scrap.kakaocdn.net/dn/cYPjFl/hyN637rP23/R0KzV6GD7kjje4U2cKTX80/img.jpg?width=919&amp;amp;height=574&amp;amp;face=0_0_919_574');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;17378번: 공의 합집합&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;3차원 좌표공간에 n개의 공(ball)이 있다. 이 중 i (1 &amp;le; i &amp;le; n)번째 공은 겉표면이 중심이 (xi, 0, 0)이고 반지름은 ri인 구 형태이며, 이 공이 차지하는 영역은 Si = {(x, y, z) &amp;isin; ℝ3 : (x - xi)2 + y2 + z2 &amp;le; ri&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PS | CP/Baekjoon OJ</category>
      <author>SafeSpot</author>
      <guid isPermaLink="true">https://safepost.tistory.com/40</guid>
      <comments>https://safepost.tistory.com/entry/17378-%EA%B3%B5%EC%9D%98-%ED%95%A9%EC%A7%91%ED%95%A9#entry40comment</comments>
      <pubDate>Wed, 20 Apr 2022 00:46:22 +0900</pubDate>
    </item>
  </channel>
</rss>