<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CRT on Jiho Kim</title><link>https://blog.wlgh7407.com/tags/crt/</link><description>Recent content in CRT on Jiho Kim</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 06 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.wlgh7407.com/tags/crt/index.xml" rel="self" type="application/rss+xml"/><item><title>BOJ 11385 씽크스몰</title><link>https://blog.wlgh7407.com/posts/algorithm/ps/260407_algorithm_boj-11385-%EC%94%BD%ED%81%AC%EC%8A%A4%EB%AA%B0/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.wlgh7407.com/posts/algorithm/ps/260407_algorithm_boj-11385-%EC%94%BD%ED%81%AC%EC%8A%A4%EB%AA%B0/</guid><description>&lt;h2 id="-문제-정보"&gt;&lt;a href="#-%eb%ac%b8%ec%a0%9c-%ec%a0%95%eb%b3%b4" class="header-anchor"&gt;&lt;/a&gt;📝 문제 정보
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;링크: &lt;a class="link" href="https://www.acmicpc.net/problem/11385" target="_blank" rel="noopener"
 &gt;https://www.acmicpc.net/problem/11385&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-관찰-및-접근"&gt;&lt;a href="#-%ea%b4%80%ec%b0%b0-%eb%b0%8f-%ec%a0%91%ea%b7%bc" class="header-anchor"&gt;&lt;/a&gt;🧐 관찰 및 접근
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;그냥 FFT의 정의대로, 두 다항식의 곱을 해서 계수들을 구해야한다.&lt;/li&gt;
&lt;li&gt;그런데 값이&amp;hellip; 너무 많이 커질 수 있다.&lt;/li&gt;
&lt;li&gt;$N, M = 1000000$, 모든 $a, b = 1000000$이라면&amp;hellip; $f(x) \times g(x)$의 $1000000$차항의 계수는 $10^{18}$이 되는 것 같다.
&lt;ul&gt;
&lt;li&gt;이건 FFT로 하면 실수오차가 너무 심할 것 같은데&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이럴때, &lt;a class="link" href="https://blog.wlgh7407.com/posts/algorithm/topics/260406_til_ntt%28number-theoretic-transform%29---%EC%A0%95%EC%88%98%EB%A1%A0%EC%A0%81-%EB%B3%80%ED%99%98/" &gt;NTT&lt;/a&gt;를 여러 소수 $p_1, p_2, \cdots$에 대해서 구해두고, 중국인의 나머지 정리를 이용해 원래 계수를 복원하는 방법을 생각할 수 있겠다.
&lt;ul&gt;
&lt;li&gt;CRT를 사용하면, $\text{LCM}(m_1, m_2)$ 에 대한 모듈러 값을 얻을 수 있다.&lt;/li&gt;
&lt;li&gt;$p_1 = 998244353, p_2 = 1004535809$을 사용하면 $p_1p_2 &gt; 10^{18}$이므로, 두개면 되겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-풀이"&gt;&lt;a href="#-%ed%92%80%ec%9d%b4" class="header-anchor"&gt;&lt;/a&gt;💻 풀이
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;코드 (C++):&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="paywall-wrapper"&gt;
 &lt;div class="paywall-content paywall-locked"&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;solve&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; N, M; cin &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; N &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; M; N&lt;span style="color:#f92672"&gt;++&lt;/span&gt;; M&lt;span style="color:#f92672"&gt;++&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; f(N), g(M);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, N) cin &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; f[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, M) cin &lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; g[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; sz &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt;(sz &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; N&lt;span style="color:#f92672"&gt;+&lt;/span&gt;M) sz &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;mint&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; A1(sz), A2(sz);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, N) A1[i] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; f[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, M) A2[i] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; g[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FFT&lt;span style="color:#f92672"&gt;::&lt;/span&gt;ntt(A1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FFT&lt;span style="color:#f92672"&gt;::&lt;/span&gt;ntt(A2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, sz) A1[i] &lt;span style="color:#f92672"&gt;*=&lt;/span&gt; A2[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FFT&lt;span style="color:#f92672"&gt;::&lt;/span&gt;ntt(A1, true);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vector&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;mint2&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; B1(sz), B2(sz);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, N) B1[i] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; f[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, M) B2[i] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; g[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FFT&lt;span style="color:#f92672"&gt;::&lt;/span&gt;ntt(B1);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FFT&lt;span style="color:#f92672"&gt;::&lt;/span&gt;ntt(B2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, sz) B1[i] &lt;span style="color:#f92672"&gt;*=&lt;/span&gt; B2[i];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; FFT&lt;span style="color:#f92672"&gt;::&lt;/span&gt;ntt(B1, true);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ll ans &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rep(i, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, N&lt;span style="color:#f92672"&gt;+&lt;/span&gt;M&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ll r1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; A1[i].val, r2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; B1[i].val;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;auto&lt;/span&gt; [x, m] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; EGCD&lt;span style="color:#f92672"&gt;::&lt;/span&gt;CRT(MOD, r1, MOD2, r2);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ans &lt;span style="color:#f92672"&gt;^=&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; ans;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt;
 &lt;div class="paywall-overlay"&gt;
 &lt;div class="paywall-icon"&gt;🔒&lt;/div&gt;
 &lt;p class="paywall-title"&gt;구현 코드 잠금&lt;/p&gt;
 &lt;p class="paywall-desc"&gt;아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.&lt;br&gt;광고 수익이 블로그 운영에 도움이 됩니다 🙏&lt;/p&gt;
 &lt;a
 href="https://link.coupang.com/a/dOJ25W"
 target="_blank"
 rel="sponsored noopener"
 class="paywall-btn"
 onclick="paywallUnlock()"
 &gt;
 🛒 쿠팡 방문하고 코드 보기
 &lt;/a&gt;
 &lt;p class="paywall-hint"&gt;방문 후 잠금이 자동으로 해제됩니다&lt;/p&gt;
 &lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>