<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Number Theory |</title><link>https://sichen-wang.github.io/tags/number-theory/</link><atom:link href="https://sichen-wang.github.io/tags/number-theory/index.xml" rel="self" type="application/rss+xml"/><description>Number Theory</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Tue, 09 Apr 2024 16:43:16 +0000</lastBuildDate><image><url>https://sichen-wang.github.io/media/icon_hu_9dfcb674aa885f38.png</url><title>Number Theory</title><link>https://sichen-wang.github.io/tags/number-theory/</link></image><item><title>整除性校验的本质</title><link>https://sichen-wang.github.io/blog/%E6%95%B4%E9%99%A4%E6%80%A7%E6%A0%A1%E9%AA%8C%E7%9A%84%E6%9C%AC%E8%B4%A8/</link><pubDate>Tue, 09 Apr 2024 16:43:16 +0000</pubDate><guid>https://sichen-wang.github.io/blog/%E6%95%B4%E9%99%A4%E6%80%A7%E6%A0%A1%E9%AA%8C%E7%9A%84%E6%9C%AC%E8%B4%A8/</guid><description>&lt;p&gt;从小学开始我们就知道, 一个数能被 \(3\) 整除当且仅当其各位数字之和能被 \(3\) 整除. 一个数能被 \(4\) 整除, 当且仅当其最后 \(2\) 位数能被 \(4\) 整除. 一个数能被 \(11\) 整除, 当且仅当其奇数位减去偶数位数字之和能被 \(11\) 整除(个位数记为第 \(1\) 位).&lt;/p&gt;
&lt;p&gt;长大一点后, 我们可以用数学语言来刻画这个规律 :&lt;/p&gt;
\[
\begin{cases}
\overline{a_ta_{t - 1}\cdots a_2a_1} \equiv a_1 + a_2 + \cdots + a_t \pmod 3 \\
\overline{a_ta_{t - 1}\cdots a_2a_1} \equiv \overline{a_2a_2} \pmod 4 \\
\overline{a_ta_{t - 1}\cdots a_2a_1} \equiv a_1 - a_2 + a_3 - \cdots + (-1)^{t - 1} a_t \pmod {11} \\
\overline{a_ta_{t - 1}\cdots a_2a_1} \equiv \overline{a_3a_2a_1} - \overline{a_6a_5a_4} + \cdots + (-1)^{\frac{t}{3} - 1} \overline{a_ta_{t - 1}a_{t - 2}} \pmod 7
\end{cases}
\]&lt;p&gt;容易发现, 其分为 \(3\) 类 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一类: \(x\) 与 \(x\) 的末 \(k\) 位在模 \(n\) 意义下同余.&lt;/li&gt;
&lt;li&gt;第二类: \(x\) 与 \(x\) 每 \(k\) 位一段求和得到的数在模 \(n\) 意义下同余.&lt;/li&gt;
&lt;li&gt;第三类: \(x\) 与 \(x\) 每 \(k\) 位一段正负交替求和得到的数在模 \(n\) 意义下同余.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在我们来探寻 \(b\) 进制数在模 \(n\) 意义下可以使用哪种同余化简方式(或不满足三类中任意一种).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;若存在 \(k\) 满足 \(b^{k} \equiv 0 \pmod n\), 那么 \(\overline{a_{t}a_{t - 1}\cdots a_{k + 1}00 \cdots 0} \equiv 0 \pmod n\), 则 \(\overline{a_{t}a_{t - 1}\cdots a_{2}a_{1}} \equiv \overline{a_{k}a_{k - 1}\cdots a_{2}a_{1}} \pmod n\), 可以使用第一类化简方式.&lt;/li&gt;
&lt;li&gt;若存在 \(k\) 满足 \(b^{k} \equiv 1 \pmod n\), 那么 \(\overline{a_{t}a_{t - 1}\cdots a_{k + 1}00 \cdots 0} \equiv \overline{a_{t}a_{t - 1}\cdots a_{k + 1}} \pmod n\), 则 \(\overline{a_{t}a_{t - 1}\cdots a_{2}a_{1}} \equiv \overline{a_{k}a_{k - 1}\cdots a_{1}} + \overline{a_{2k}a_{2k - 1}\cdots a_{k + 1}} + \cdots \pmod n\), 可以使用第二类化简方式.&lt;/li&gt;
&lt;li&gt;若存在 \(k\) 满足 \(b^{k} \equiv -1 \pmod n\), 那么 \(\overline{a_{pk}a_{pk - 1}\cdots a_{(p - 1)k + 1} 00\cdots 0} \equiv (-1)^{p}\overline{a_{pk}a_{pk - 1}\cdots a_{(p - 1)k + 1}}\), 则 \(\overline{a_{t}a_{t - 1}\cdots a_{2}a_{1}} \equiv \overline{a_{k}a_{k - 1}\cdots a_{1}} - \overline{a_{2k}a_{2k - 1}\cdots a_{k + 1}} + \cdots \pmod n\), 可以使用第三类化简方式.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;于是想找到 \(b\) 进制数在模 \(n\) 意义下的化简方式, 只需要找到最小的 \(k\) 满足 \(b^{k} \equiv 0\ \textrm{or}\ 1\ \textrm{or}- 1\) 即对应第 \(1/2/3\) 类化简方式. 若直到 \(k\) 等于 \(b\) 的幂在模 \(n\) 意义下的循环节长度仍未找到满足条件的 \(k\), 则 \(b\) 进制数在模 \(n\) 意义下不能使用这 \(3\) 种方式化简.&lt;/p&gt;
&lt;p&gt;一种找最小 \(k\) 的代码实现如下 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;bits/stdc++.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;unordered_map&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scanf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scanf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%d%d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;%=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1ll&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;kind = %d, k = %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>原根和阶</title><link>https://sichen-wang.github.io/blog/%E5%8E%9F%E6%A0%B9%E5%92%8C%E9%98%B6/</link><pubDate>Sat, 24 Jun 2023 11:00:56 +0000</pubDate><guid>https://sichen-wang.github.io/blog/%E5%8E%9F%E6%A0%B9%E5%92%8C%E9%98%B6/</guid><description>&lt;h2 id="阶的定义及求法"&gt;阶的定义及求法&lt;/h2&gt;
&lt;p&gt;称使得 \(a^{t}\equiv 1\pmod p\) 成立的最小正整数 \(t_{min}\) 为 \(a\) 对模数 \(p\) 的阶，记为 \(\delta_{p}(a)\)。&lt;/p&gt;
&lt;p&gt;有如下定理 ：\(\delta_{p}(a) \mid n\Longleftrightarrow a^{n}\equiv 1\pmod p\)。&lt;/p&gt;
&lt;p&gt;又有 \(a^{\varphi(p)}\equiv 1\pmod p\Longrightarrow \delta_{p}(a) \mid \varphi(p)\) 可得一个 \(\Theta(\sqrt{p}+\log^{2p})\) 求阶的算法：&lt;/p&gt;
&lt;p&gt;首先将 \(\varphi(p)\) 分解成 \(\varphi(p)=k_{1}^{q_{1}}\times k_{2}^{q_{2}}\times \cdots \times k_{r}^{q_{r}}\) 的形式，令 \(\delta_{p}(a)=\varphi(p)\)，然后试着用每一个质因子去除 \(\delta_{p}(a)\)，如果除了之后 \(a^{\frac{\delta_{p}(a)}{k_{i}}}\equiv 1\pmod p\) 那么 \(\frac{\delta_{p}(a)}{k_{i}}\) 就作为新的阶，直到不能再除，此时的 \(\delta_{p}(a)\) 就为 \(a\) 在模 \(p\) 意义下真正的阶。&lt;/p&gt;
&lt;h2 id="原根的定义及求法"&gt;原根的定义及求法&lt;/h2&gt;
&lt;p&gt;原根 \(g\) 是使得 \(g^{1\sim p-1}\) 在模 \(p\) 意义下的值与 \([1,p-1]\) 形成一一对应关系的值。&lt;/p&gt;
&lt;p&gt;有如下定理 ：\(g\) 为 \(p\) 的原根当且仅当 \(\delta_{p}(g)=\varphi(p)\)。&lt;/p&gt;
&lt;p&gt;于是可以导出一个计算 \(g_{min}\) 的算法，从小到大枚举 \(g\)，若 \(\delta_{p}(g)=\varphi(p)\)，则 \(g\) 为 \(p\) 的最小原根。&lt;/p&gt;
&lt;p&gt;有如下定理 ：\(g_{min}\lt p^{\frac{1}{4}}\)。&lt;/p&gt;
&lt;p&gt;所以以上算法时间复杂度为 \(\Theta(\sqrt{p}+p^{\frac{1}{4}}\omega(p))\)。&lt;/p&gt;</description></item><item><title>杜教筛</title><link>https://sichen-wang.github.io/blog/%E6%9D%9C%E6%95%99%E7%AD%9B/</link><pubDate>Sat, 24 Jun 2023 11:00:56 +0000</pubDate><guid>https://sichen-wang.github.io/blog/%E6%9D%9C%E6%95%99%E7%AD%9B/</guid><description>&lt;p&gt;杜教筛被用来求积性函数的前缀和。&lt;/p&gt;
&lt;p&gt;设有积性函数 \(f(x)\)，其前缀和为 \(S(n) = \sum \limits_{i = 1}^{n} f(i)\)。&lt;/p&gt;
&lt;p&gt;考虑构造 \(h(x)\) 和 \(g(x)\)，满足 \(h = f \times g\)。&lt;/p&gt;
&lt;p&gt;推一下式子 ：&lt;/p&gt;
\[
\begin{aligned}
\sum _ {i = 1} ^ n h(i) &amp;= \sum _ {i = 1} ^ n \sum _ {d | i} g(d) \times f\left(\frac{i}{d}\right) \\
&amp;= \sum _ {d = 1} ^ n g(d) \sum _ {i = 1} ^ {\left\lfloor\frac{n}{d}\right\rfloor} f(i) \\
&amp;= \sum _ {d = 1} ^ n g(d) S\left(\left\lfloor\frac{n}{d}\right\rfloor\right)
\end{aligned}
\]&lt;p&gt;众所周知有数论分块。&lt;/p&gt;
&lt;p&gt;具体来说，观察到式子右边的 \(S\left(\left\lfloor\frac{n}{d}\right\rfloor\right)\) 最多有 \(2\sqrt{n}\) 种取值。证明考虑 \(\sum \limits_{d = 1}^{\sqrt{n}} \left\lfloor\frac{n}{d}\right\rfloor\) 显然最多有 \(\sqrt{n}\) 种取值，\(\forall d \gt \sqrt{n},\left\lfloor\frac{n}{d}\right\rfloor \lt \sqrt{n}\)，故 \(\sum \limits_{d = \sqrt{n} + 1}^{n} \left\lfloor\frac{n}{d}\right\rfloor\) 也最多有 \(\sqrt{n}\) 种取值。&lt;/p&gt;
&lt;p&gt;于是这时候只需要考虑对于一个数 \(i\)，满足 \(\left\lfloor\frac{n}{i}\right\rfloor = \left\lfloor\frac{n}{j}\right\rfloor\) 的最大的 \(j\) 是多少。&lt;/p&gt;
&lt;p&gt;设 \(k = \left\lfloor\frac{n}{i}\right\rfloor\)，则有 \(\left\lfloor\frac{n}{j}\right\rfloor = k\)，将向下取整去掉，有 \(k \leqslant \frac{n}{j} \lt k + 1\)，取倒数，得到 \(\frac{1}{k + 1} \lt \frac{j}{n} \leqslant \frac{1}{k}\)，全部乘上 \(n\) 得到 \(\frac{n}{k + 1} \lt j \leqslant \frac{n}{k}\)，又因为 \(j\) 为整数，所以 \(j_{\max} = \left\lfloor\frac{n}{k}\right\rfloor = \left\lfloor\frac{n}{\left\lfloor\frac{n}{i}\right\rfloor}\right\rfloor\)。&lt;/p&gt;
&lt;p&gt;言归正传，求解杜教筛最终式子时可以直接递归，中间需要记忆化一下，但其实不需要用到 \(\rm map\) 系列 \(\rm STL\)，因为可以证明需要求解的 \(S(x)\) 中 \(x \in \{\left\lfloor\frac{n}{d}\right\rfloor{}|d \in [1, n]\}\)。&lt;/p&gt;
&lt;p&gt;稍加思考就可以发现，上式的一个充分条件为 \(\left\lfloor\frac{\left\lfloor\frac{n}{i}\right\rfloor}{j}\right\rfloor = \left\lfloor\frac{n}{ij}\right\rfloor\)，考虑其证明：\(\forall x \in Z\)，若有 \(x \leqslant \left\lfloor\frac{\left\lfloor\frac{n}{i}\right\rfloor}{j}\right\rfloor\)，那么有 \(xj \leqslant \left\lfloor\frac{n}{i}\right\rfloor\)，进一步有 \(xij \leqslant n\)，再将 \(ij\) 放回去有 \(x \leqslant \left\lfloor\frac{n}{ij}\right\rfloor\)，原式得证。&lt;/p&gt;
&lt;p&gt;故我们只需要将 \(\left\lfloor\frac{n}{d}\right\rfloor\ (d \in [1, n] \cap Z)\) 的所有取值映射到一个数组上就可以直接记忆化了。&lt;/p&gt;
&lt;p&gt;考虑复杂度证明，记忆化以后每个 \(S(x)\) 只需要算一次，而算一次 \(S(x)\) 的时间复杂度为 \(\Theta(\sqrt{x})\)。 故总时间复杂度为 \(\sum\limits_{x} \sqrt{x}\ (x \in \{\left\lfloor\frac{n}{d}\right\rfloor|d \in [1, n] \cap Z\})\)。 对于不大于 \(\sqrt{n}\) 的 \(d\)，其贡献的复杂度上界为 \(\sum \limits_{i = 1}^{\sqrt{n}} \Theta\left(\sqrt{\frac{n}{i}}\right)\)，而对于大于 \(\sqrt{n}\) 的 \(d\)，\(\left\lfloor\frac{n}{d}\right\rfloor\) 的取值不大于 \(\sqrt{n}\)，所以其贡献的上界为 \(\sum \limits_{i = 1}^{\sqrt{n}} \Theta(\sqrt{i})\)，其和为 \(T(n) = \sum \limits_{i = 1}^{\sqrt{n}} \Theta\left(\sqrt{\frac{n}{i}}\right) + \sum \limits_{i = 1}^{\sqrt{n}} \Theta(\sqrt{i})\)，积分求个近似可以得到 \(T(n) \approx \int_{1}^{\sqrt{n}} \Theta\left(\sqrt{\frac{n}{x}}\right) dx + \int_{1}^{\sqrt{n}} \Theta(\sqrt{x}) dx = \Theta(n^{\frac{3}{4}})\)。&lt;/p&gt;
&lt;p&gt;事实上还可以做到更优，线性预处理 \(f\) 的前 \(m\) 项，易知复杂度变成了 \(\Theta(m) + \Theta\left(\sum \limits_{i = 1}^{\frac{n}{m}} \sqrt{\frac{n}{i}}\right)\)，跟之前一样积分近似一下可以得到复杂度即为 \(\Theta(m + nm^{-\frac{1}{2}})\)，易知其下界为 \(\Theta(n^{\frac{2}{3}})\)。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;在此列举一些常见的构造（其证明需要用到迪利克雷生成函数，略过）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;\((id^{k} \cdot \mu) \times id^{k} = \varepsilon\)&lt;/li&gt;
&lt;li&gt;\((id^{k} \cdot \varphi) \times id^{k} = id^{k + 1}\)&lt;/li&gt;
&lt;li&gt;\((id^{k} \cdot \sigma_{k}) \times (id^{k} \cdot \mu) = id^{2k}\)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>简单的代数反演</title><link>https://sichen-wang.github.io/blog/%E7%AE%80%E5%8D%95%E7%9A%84%E4%BB%A3%E6%95%B0%E5%8F%8D%E6%BC%94/</link><pubDate>Sat, 24 Jun 2023 11:00:56 +0000</pubDate><guid>https://sichen-wang.github.io/blog/%E7%AE%80%E5%8D%95%E7%9A%84%E4%BB%A3%E6%95%B0%E5%8F%8D%E6%BC%94/</guid><description>&lt;h2 id="二项式反演"&gt;二项式反演&lt;/h2&gt;
&lt;h3 id="数列形式"&gt;数列形式&lt;/h3&gt;
\[
g(x)=\sum_{i=x}^n\dbinom{i}{x}f(i)\iff f(x)=\sum_{i=x}^n (-1)^{i-x}\dbinom{i}{x}g(i)
\]&lt;p&gt;\(\large\rm Proof:\)&lt;/p&gt;
&lt;p&gt;将上式带入下式得 \(:\)&lt;/p&gt;
\[
f(x)=\sum_{i=x}^n (-1)^{i-x}\dbinom{i}{x}\sum_{j=i}^n\dbinom{j}{i}f(j)
\]&lt;p&gt;整理得 \(:\)&lt;/p&gt;
\[
f(x)=\sum_{i=x}^n\sum_{j=i}^n(-1)^{i-x}\dbinom{j}{i}\dbinom{i}{x}f(j)
\]&lt;p&gt;根据组合恒等式 \(\dbinom{i}{j}\dbinom{j}{k}=\dbinom{i}{k}\dbinom{i-k}{j-k}\) 得 \(:\)&lt;/p&gt;
\[
f(x)=\sum_{i=x}^n\sum_{j=i}^n(-1)^{i-x}\dbinom{j}{x}\dbinom{j-x}{i-x}f(j)
\]&lt;p&gt;交换枚举顺序得 \(:\)&lt;/p&gt;
\[
f(x)=\sum_{j=x}^n\sum_{i=x}^j(-1)^{i-x}\dbinom{j}{x}\dbinom{j-x}{i-x}f(j)
\]&lt;p&gt;改变代表字母，整理得 \(:\)&lt;/p&gt;
\[
f(x)=\sum_{i=x}^n\dbinom{i}{x}f(i)\sum_{j=x}^i(-1)^{j-x}\dbinom{i-x}{j-x}
\]&lt;p&gt;将靠后的 \(\sum\) 枚举的 \(j\) 替换成 \(j+x\) 得 \(:\)&lt;/p&gt;
\[
f(x)=\sum_{i=x}^n\dbinom{i}{x}f(i)\sum_{j=0}^{i-x}(-1)^{j}\dbinom{i-x}{j}
\]\[
\because \sum_{i=0}^k(-1)^i\dbinom{k}{i}=(1-1)^k
\]\[
\therefore \sum_{i=0}^k(-1)^i\dbinom{k}{i}=[k=0]
\]&lt;p&gt;所以此式不为 \(0\) 当且仅当 \(i=x\)，故 \(:\)&lt;/p&gt;
\[
f(x)=\sum_{i=x}\dbinom{x}{x}f(i)=f(x)
\]&lt;p&gt;原式得证。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们来看看二项式反演的数列形式有什么应用：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;乱序排列问题：&lt;/strong&gt; 求有多少种不同的长度为 \(n\) 的排列 \(p\)，使得 \(\forall i\in [1,n],p_{i}\not = i\)。&lt;/p&gt;
&lt;p&gt;令 \(g(i)\) 表示钦定有 \(i\) 个数一定在自己的位置上，剩下的随便排的方案数，显然有 :&lt;/p&gt;
\[
g(i)=\dbinom{n}{i}(n-i)!
\]&lt;p&gt;令 \(f(i)\) 表示恰好有 \(i\) 个数在自己的位置上的方案数，考虑到 \(f(i)\) 会被 \(g(j)\ (j\leqslant i)\) 计算 \(\dbinom{i}{j}\) 次，于是有 \(:\)&lt;/p&gt;
\[
g(i)=\sum_{j=i}^n\dbinom{j}{i}f(j)
\]&lt;p&gt;根据二项式反演 \(:\)&lt;/p&gt;
\[
f(i)=\sum_{j=i}^n(-1)^{j-i}\dbinom{j}{i}g(j)
\]&lt;p&gt;将 \(g(i)=\dbinom{n}{i}(n-i)!\) 带入得 \(:\)&lt;/p&gt;
\[
f(i)=\sum_{j=i}^n(-1)^{j-i}\dbinom{j}{i}\dbinom{n}{j}(n-j)!
\]&lt;p&gt;根据组合恒等式 \(\dbinom{i}{j}\dbinom{j}{k}=\dbinom{i}{k}\dbinom{i-k}{j-k}\)，整理得 \(:\)&lt;/p&gt;
\[
f(i)=\dbinom{n}{i}\sum_{j=i}^n(-1)^{j-i}\dbinom{n-i}{j-i}(n-j)!
\]&lt;p&gt;考虑到当 \(i=0\) 时为答案，所以 \(:\)&lt;/p&gt;
\[
\begin{aligned}
Ans=f(0)&amp;=\sum_{i=0}^n(-1)^i\dbinom{n}{i}(n-i)!\\
&amp;=\sum_{i=0}^n(-1)^i\dfrac{n!}{i!}\\
&amp;=(n+1)!\sum_{i=0}^n(-1)^i(i!)^{-1}
\end{aligned}
\]&lt;h3 id="集合形式"&gt;集合形式&lt;/h3&gt;
\[
f(S)=\sum_{S\subseteq T}g(T)\iff g(S)=\sum_{S\subseteq T} (-1)^{|T|-|S|}f(T)
\]&lt;p&gt;\(\large\rm Proof:\)&lt;/p&gt;
&lt;p&gt;同样考虑带入证明 ：&lt;/p&gt;
\[
\begin{aligned}
f(S)&amp;=\sum_{S\subseteq T}\sum_{T\subseteq R}(-1)^{|R|-|T|}f(R)\\
&amp;=\sum_{S\subseteq R}f(R)\sum_{S\subseteq T\subseteq R}(-1)^{|R|-|T|}
\end{aligned}
\]&lt;p&gt;考虑枚举 \(T-S\) 的大小 ：&lt;/p&gt;
\[
\begin{aligned}
f(S)&amp;=\sum_{S\subseteq R}f(R)\sum_{i=0}^{|R|-|S|}\dbinom{|R|-|S|}{i}(-1)^{|R|-(|S|+i)}\\
&amp;=\sum_{S\subseteq R}[|S|=|R|]\\
&amp;=f(S)
\end{aligned}
\]&lt;p&gt;原式得证。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们来看看二项式反演的集合形式有什么应用：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;有向图无环子图计数：&lt;/strong&gt; 给定一张 \(n\) 个点的有向图，求其无环子图的数量。&lt;/p&gt;
&lt;p&gt;考虑动态规划，设 \(f_{S}\) 表示点集 \(S\) 导出子图的答案。&lt;/p&gt;
&lt;p&gt;由于是 \(\rm DAG\) 计数，所以我们可以很自然地想到枚举入度为 \(0\) 的点，假设 \(T\) 是 \(S\) 的子集，并且其中的每个点都没有入边，那么显然有转移 ：&lt;/p&gt;
\[
f_S=\sum_{T\subseteq S,T\not = \varnothing}2^{cnt_{T,S-T}}\times f_{S-T}
\]&lt;p&gt;其中 \(cnt_{S,T}\) 表示集合 \(S\) 到集合 \(T\) 的连边总数。&lt;/p&gt;
&lt;p&gt;但我们发现这样做实际上是错的，因为 \(T\) 不一定包含了 \(S\) 中所有入度为 \(0\) 的点，我们考虑容斥。&lt;/p&gt;
&lt;p&gt;设 \(q_{T}=2^{cnt_{T,S-T}}\times f_{S-T}\)，\(p_{T}\) 表示 \(S\) 中恰好有 \(T\) 作为入度为 \(0\) 的点的方案数，有 \(q_{T}=\sum\limits_{T\subseteq S} p_{S}\)。&lt;/p&gt;
&lt;p&gt;由二项式反演的集合形式可以得到 ：&lt;/p&gt;
\[
p_S=\sum_{S\subseteq T}(-1)^{|T|-|S|}q_T
\]&lt;p&gt;回到原本的 \(\rm DP\)，我们需要求 ：&lt;/p&gt;
\[
\begin{aligned}
f_S&amp;=\sum_{T\subseteq S,T\not= \varnothing}p_T\\
&amp;=\sum_{T\subseteq S,T\not= \varnothing}\sum_{T\subseteq R\subseteq S}(-1)^{|R|-|T|}q_R\\
&amp;=\sum_{R\subseteq S,R\not= \varnothing}q_R \sum_{T\subseteq R,T\not=\varnothing}(-1)^{|R|-|T|}\\
&amp;=\sum_{R\subseteq S,R\not= \varnothing}q_R (-1)^{|R|}\left(\sum_{T\subseteq R}(-1)^{-|T|}-1\right)\\
&amp;=\sum_{T\subseteq S,T\not= \varnothing}(-1)^{|T|-1}q_T
\end{aligned}
\]&lt;p&gt;于是转移方程为 ：&lt;/p&gt;
\[
f_S=\sum_{T\subseteq S,T\not= \varnothing}(-1)^{|T|-1}2^{cnt_{T,S-T}}f_{S-T}
\]&lt;p&gt;现在只需要 \(\Theta(1)\) 计算 \(cnt_{T,S-T}\) 即可做到 \(\Theta(3^{n})\) 计算计算答案，考虑预处理。&lt;/p&gt;
&lt;p&gt;可以在枚举了每个 \(S\) 做转移的时候再算这个东西，此时只需要记 \(cnt_{T}\ (T\subseteq S,T\not=\varnothing)\) 表示 \(T\) 恰好作为 \(S\) 中没有入度的点集的路径数。考虑在进行所有计算之前预处理 \(A_{i,S}\) 表示 \(i\) 到 \(S\) 中的边数，\(D_{i,S}\) 表示 \(S\) 中的点到 \(i\) 的边数和，这两个数组都可以 \(\Theta(n2^{n})\) 预处理。&lt;/p&gt;
&lt;p&gt;计算 \(cnt\) 时考虑从小到大枚举每个 \(T\) 计算答案，可以发现 \(T\) 的每个真子集的答案都已经被计算出来了，于是任取一个点从 \(T\) 中移到 \(S-T\) 即可算出答案，这里考虑 \(\Theta(1)\) 枚举 &lt;code&gt;lowbit&lt;/code&gt;. 可以发现，转移式为 ：&lt;/p&gt;
\[
cnt_T=cnt_{T-\{u\}}+A_{u,S-T}-D_{T-\{u\},u}
\]&lt;p&gt;于是本题到此，可以做到时间复杂度 \(\Theta(3^{n})\)，空间复杂度 \(\Theta(n2^{n})\)。&lt;/p&gt;
&lt;h3 id="子集反演"&gt;子集反演&lt;/h3&gt;
\[
f(S)=\sum_{T\subseteq S}g(T)\iff g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T)
\]&lt;p&gt;\(\large\rm Proof:\)&lt;/p&gt;
&lt;p&gt;还是考虑带入证明，与二项式反演的集合形式类似 \(:\)&lt;/p&gt;
\[
\begin{aligned}
f(S)&amp;=\sum_{T\subseteq S}\sum_{R\subseteq T}(-1)^{|T|-|R|}f(R)\\
&amp;=\sum_{R\subseteq S}f(R)\sum_{R\subseteq T\subseteq S}(-1)^{|T|-|R|}\\
&amp;=\sum_{R\subseteq S}f(R)\sum_{i=0}^{|S|-|R|}\dbinom{|S|-|R|}{i}(-1)^{(|S|-i)-|R|}\\
&amp;=\sum_{R\subseteq S}[|R|=|S|]\\
&amp;=f(S)
\end{aligned}
\]&lt;p&gt;原式得证。&lt;/p&gt;
&lt;h2 id="斯特林反演"&gt;斯特林反演&lt;/h2&gt;
&lt;h3 id="第二类斯特林数"&gt;第二类斯特林数&lt;/h3&gt;
&lt;h4 id="定义"&gt;定义&lt;/h4&gt;
&lt;p&gt;定义 \(\begin{Bmatrix}n \ m\end{Bmatrix}\) 为将 \(n\) 个有标号小球放入 \(m\) 个无标号盒子，每个盒子不能为空的方案。&lt;/p&gt;
&lt;h4 id="递推式"&gt;递推式&lt;/h4&gt;
\[
\begin{Bmatrix}n \ m\end{Bmatrix} = \begin{Bmatrix}n - 1 \ m - 1\end{Bmatrix} + m \times \begin{Bmatrix}n - 1 \ m\end{Bmatrix}
\]&lt;p&gt;根据组合意义不难证明。&lt;/p&gt;
&lt;h4 id="求一行第二类斯特林数"&gt;求一行第二类斯特林数&lt;/h4&gt;
&lt;p&gt;考虑以下第二类斯特林数的组合意义，我们考虑使用容斥描述第二类斯特林数的答案。&lt;/p&gt;
&lt;p&gt;首先我们求出将 \(n\) 个有标号小球放入 \(m\) 个有标号盒子，盒子不能为空的方案，根据这个问题的特殊性，任意一种无标号盒子的方案恰好双向对应 \(m!\) 中有标号盒子的方案，最后除 \(m!\) 即可。&lt;/p&gt;
&lt;p&gt;对于盒子是否为空进行容斥：&lt;/p&gt;
\[
\begin{Bmatrix}n \ m\end{Bmatrix} = \frac{1}{m!} \sum\limits_i ^ m (-1) ^ i \dbinom{m}{i}(m - i) ^ n
\]&lt;p&gt;显然是一个卷积的形式，\(\rm NTT\) 即可做到 \(\mathcal{O(n \log n)}\)。&lt;/p&gt;
&lt;h4 id="求一列第二类斯特林数"&gt;求一列第二类斯特林数&lt;/h4&gt;
&lt;p&gt;不难发现第二类斯特林数的定义与 \(\exp\) 的组合意义很相似，于是我们考虑 \(\rm EGF:\) \(\widehat F(x) = \sum\limits_{i = 1}^{\infty} \frac{x^{i}}{i!} = e^{x} - 1\)。&lt;/p&gt;
&lt;p&gt;那么根据 \(\rm EGF\) 相乘的组合意义，\([\dfrac{x^{n}}{n!}]\widehat F^{m}(x) = [\dfrac{x^{n}}{n!}](e^{x} - 1)^{m} = \begin{Bmatrix}n \ m\end{Bmatrix}\)。&lt;/p&gt;
&lt;p&gt;使用多项式快速幂即可做到 \(\mathcal{O(n \log n)}\)。&lt;/p&gt;
&lt;h3 id="第一类斯特林数"&gt;第一类斯特林数&lt;/h3&gt;
&lt;h4 id="定义-1"&gt;定义&lt;/h4&gt;
&lt;p&gt;定义 \(\begin{bmatrix}n \ m\end{bmatrix}\) 为将 \(n\) 个数划分成 \(m\) 个互不区分的非空置换的方案数。&lt;/p&gt;
&lt;h4 id="递推式-1"&gt;递推式&lt;/h4&gt;
\[
\begin{bmatrix}n \ m\end{bmatrix} = \begin{bmatrix}n - 1 \ m - 1\end{bmatrix} + (n - 1) \times \begin{bmatrix}n - 1 \ m\end{bmatrix}
\]&lt;p&gt;由组合意义不难证明。&lt;/p&gt;
&lt;h4 id="求一行第一类斯特林数"&gt;求一行第一类斯特林数&lt;/h4&gt;
&lt;p&gt;因为第一类斯特林数不具有较好的组合意义，因此不能像第二类斯特林数那样使用另一种方式来描述其，因此我们直接考虑第一类斯特林数的 \(\rm OGF\)：&lt;/p&gt;
\[
\begin{aligned}
F_i(x) &amp;= \sum\limits_j ^ \infty \begin{bmatrix}i \ j\end{bmatrix} x ^ j \\
&amp;= x \times F_{i - 1}(x) + (i - 1) F_{i - 1}(x) \\
&amp;= (i + x - 1) F_{i - 1}(x) \\
&amp;= \prod\limits_j ^ {i - 1} (x + j)
\end{aligned}
\]&lt;p&gt;那么就有：&lt;/p&gt;
\[
F_n(x) = \prod\limits_i ^ {n - 1} (x + i)
\]&lt;p&gt;当然可以直接使用启发式合并做到 \(\mathcal{O(n \log^{2n})}\)，但还存在一个更加优秀的方法：倍增法。&lt;/p&gt;
\[
F_{2n}(x) = F_n(x) \times F_n(x + n)
\]&lt;p&gt;只需快速计算 \(F_{n}(x + n)\) 即可，令 \(F_{n}(x) = \sum\limits_{i}^{\infty} f_{i} x^{i}\)：&lt;/p&gt;
\[
\begin{aligned}
F_n(x + n) &amp;= \sum\limits_i ^ n f_i(x + n) ^ i \\
&amp;= \sum\limits_i ^ n f_i\sum\limits_j ^ i x ^ j n ^ {i - j}
\end{aligned}
\]&lt;p&gt;后者很明显是一个卷积的形式，直接计算即可，根据倍增的复杂度，可以做到 \(\mathcal{O(n \log n)}\)。&lt;/p&gt;
&lt;h4 id="求一列第一类斯特林数"&gt;求一列第一类斯特林数&lt;/h4&gt;
&lt;p&gt;类似于求一列第二类斯特林数的方法，考虑 \(\rm EGF:\) \(\widehat F(x) = \sum\limits_{i}^{\infty} \dfrac{(i - 1)!x^{i}}{i!} = \sum\limits_{i}^{\infty} \dfrac{x^{i}}{i} = \ln\left(\dfrac{1}{1 - x}\right)\)&lt;/p&gt;
&lt;p&gt;那么就有：&lt;/p&gt;
\[
\begin{bmatrix}n \ m\end{bmatrix} = [\frac{x ^ n}{n!}]\widehat F ^ m(x)
\]&lt;p&gt;使用多项式快速幂即可，复杂度 \(\mathcal{O(n \log n)}\)。&lt;/p&gt;
&lt;h3 id="普通幂-上升幂-下降幂的转换"&gt;普通幂, 上升幂, 下降幂的转换&lt;/h3&gt;
&lt;p&gt;先介绍两个最简单的：上升幂和下降幂的转换：&lt;/p&gt;
\[
x ^ {\underline{n}} = (-1) ^ n (-x) ^ {\overline n}
\]\[
x ^ {\overline{n}} = (-1) ^ n (-x) ^ {\underline n}
\]&lt;p&gt;再根据我们求一行斯特林数的方法，可以得到上升幂转普通幂公式：&lt;/p&gt;
\[
x ^ {\overline n} = \sum\limits_i ^ n \begin{bmatrix} n \ i \end{bmatrix} x ^ i
\]&lt;p&gt;而根据第二类斯特林数的组合意义，再根据普通幂 \(x^{n}\) 的组合意义，可以得到普通幂转下降幂公式：&lt;/p&gt;
\[
x ^ n = \sum\limits_i ^ x \dbinom{x}{i} \begin{Bmatrix} n \ i \end{Bmatrix} i! = \sum\limits_i ^ x \begin{Bmatrix} n \ i \end{Bmatrix} x ^ {\underline{i}}
\]&lt;p&gt;再利用最开始提到的下降幂转上升幂公式变形，我们可以得到普通幂转上升降幂公式：&lt;/p&gt;
\[
\begin{aligned}
(-x) ^ n &amp;= \sum\limits_i ^ x \begin{Bmatrix} n \ i \end{Bmatrix} (-x) ^ {\underline{i}} \\
&amp;= \sum\limits_i ^ x \begin{Bmatrix} n \ i \end{Bmatrix} (-1) ^ i x ^ {\overline{i}}
\end{aligned}
\]\[
\Longleftrightarrow x ^ n = \sum\limits_i ^ x (-1) ^ {n - i}\begin{Bmatrix} n \ i \end{Bmatrix}x ^ {\overline{i}}
\]&lt;p&gt;同理可得下降幂转普通幂公式：&lt;/p&gt;
\[
x ^ {\underline{n}} = \sum\limits_i ^ x (-1) ^ {n - i} \begin{bmatrix} n \ i \end{bmatrix} x ^ i
\]&lt;p&gt;总结一下四个公式，普通幂转出去使用第二类斯特林数，转回来使用第一类斯特林数。阶数上升（下转普，普转上）加 \(-1\)。&lt;/p&gt;
&lt;p&gt;通过这四个公式，我们也能完成一般多项式和上升幂下降幂多项式的互相转化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们来看看这几个式子有什么应用：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例题：&lt;/strong&gt; 给定 \(k\) 次多项式 \(f(x)\) 的各项系数和一个整数 \(n\)，求以下式子对 \(998244353\) 取模后的值 ：&lt;/p&gt;
\[
\sum_{i=0}^n\dbinom{n}{i}2^{n-i}f(i)
\]&lt;p&gt;我们发现带 \(f(x)\) 的式子没有前途，于是将其拆开 ：&lt;/p&gt;
\[
\sum_{i=0}^n\dbinom{n}{i}2^{n-i}\sum_{j=0}^ka_ji^j
\]&lt;p&gt;这里有个套路是将整数幂转第二类斯特林数 ：&lt;/p&gt;
\[
\begin{aligned}
m^n&amp;=\sum_{k=0}^m\dbinom{m}{k}\begin{Bmatrix}n\\ m-k\end{Bmatrix}(m-k)!\\
&amp;=\sum_{k=0}^m\begin{Bmatrix}n\\ k\end{Bmatrix}m^{\underline{k}}
\end{aligned}
\]&lt;p&gt;转化的含义是将 \(m^{n}\) 看作 \(\rm LLA\) 问题的方案数，我们发现 \(\small\begin{Bmatrix}n\\ m\end{Bmatrix}\) 是 \(\rm LUB\) 问题的方案数，于是枚举 \(m\) 个集合中有 \(k\) 个 \(0\)，然后用第二类斯特林数将 \(\rm LUA\) 算出来后乘上 \((m-k)!\) 得到 \(\rm LLA\) 的方案数。&lt;/p&gt;
&lt;p&gt;于是就可以开始推式子了 ：&lt;/p&gt;
\[
\begin{aligned}
&amp;\quad~\sum_{i=0}^n\dbinom{n}{i}2^{n-i}f(i)\\
&amp;=\sum_{i=0}^n\dbinom{n}{i}2^{n-i}\sum_{j=0}^ka_ji^j\\
&amp;=\sum_{i=0}^n\dbinom{n}{i}2^{n-i}\sum_{j=0}^ka_j\sum_{p=0}^i\dbinom{i}{p}\begin{Bmatrix}j\\ p\end{Bmatrix}p!\\
&amp;=\sum_{i=0}^n\sum_{j=0}^k\sum_{p=0}^i\dbinom{n}{i}\dbinom{i}{p}2^{n-i}a_j\begin{Bmatrix}j\\ p\end{Bmatrix}p!\\
&amp;=\sum_{j=0}^ka_j\sum_{p=0}^n\begin{Bmatrix}j\\ p\end{Bmatrix}p!\sum_{i=p}^n\dbinom{n}{i}\dbinom{i}{p}2^{n-i}\\
&amp;=\sum_{j=0}^ka_j\sum_{p=0}^n\begin{Bmatrix}j\\ p\end{Bmatrix}p!\sum_{i=p}^n\dbinom{n}{p}\dbinom{n-p}{i-p}2^{n-i}\\
&amp;=\sum_{j=0}^ka_j\sum_{p=0}^n\dbinom{n}{p}\begin{Bmatrix}j\\ p\end{Bmatrix}p!\sum_{i=0}^{n-p}\dbinom{n-p}{i}2^{n-p-i}\\
&amp;=\sum_{j=0}^k\sum_{p=0}^na_j\begin{Bmatrix}j\\ p\end{Bmatrix}\dbinom{n}{p}p!3^{n-p}\\
&amp;=\sum_{j=0}^k\sum_{p=0}^j\begin{Bmatrix}j\\ p\end{Bmatrix}a_j\times n^{\underline{p}}\times 3^{n-p}
\end{aligned}
\]&lt;p&gt;最后这个式子可以通过预处理第二类斯特林数，\(3\) 的次幂和 \(n\) 的 \(p\) 阶下降幂做到 \(\Theta(k^{2})\)。&lt;/p&gt;
&lt;h3 id="斯特林反演-1"&gt;斯特林反演&lt;/h3&gt;
&lt;p&gt;非常类似二项式反演的形式，有：&lt;/p&gt;
\[
f_n = \sum\limits_i ^ n \begin{Bmatrix} n \ i \end{Bmatrix} g_i \Longleftrightarrow g_n = \sum\limits_i ^ n (-1) ^ {n - i} \begin{bmatrix} n \ i \end{bmatrix} f_i
\]&lt;p&gt;我们首先需要了解斯特林反演基于的恒等式 \(-\) 反转公式：&lt;/p&gt;
\[
\sum\limits_{i = m} ^ n (-1) ^ {n - i} \begin{Bmatrix} n \ i \end{Bmatrix} \begin{bmatrix} i \ m \end{bmatrix} = [n = m]
\]\[
\sum\limits_{i = m} ^ n (-1) ^ {n - i} \begin{bmatrix} n \ i \end{bmatrix} \begin{Bmatrix} i \ m \end{Bmatrix} = [n = m]
\]&lt;p&gt;不难发现两式的形式非常类似，我们只证明第一条式子，第二条式子是类似的。&lt;/p&gt;
\[
\begin{aligned}
x ^ n &amp;= \sum\limits_i ^ n \begin{Bmatrix} n \ i \end{Bmatrix} x ^ {\underline{i}} \\
&amp;= \sum\limits_i ^ n \begin{Bmatrix} n \ i \end{Bmatrix} (-1) ^ i (-x) ^ {\overline{i}} \\
&amp;= \sum\limits_i ^ n (-1) ^ i \begin{Bmatrix} n \ i \end{Bmatrix} \sum\limits_j ^ i (-1) ^ j \begin{bmatrix} i \ j \end{bmatrix} x ^ j \\
&amp;= \sum\limits_i ^ n \left( \sum\limits_{j = i} ^ n (-1) ^ {i - j} \begin{Bmatrix} n \ j \end{Bmatrix} \begin{bmatrix} j \ i \end{bmatrix}\right) x ^ i
\end{aligned}
\]&lt;p&gt;根据多项式恒等原理即可证明第一条反转公式。&lt;/p&gt;
&lt;p&gt;有了这两条反转公式，就可以直接将斯特林反演左式带入右式以及右式带入左式来证明正确性了，过程是不难的。&lt;/p&gt;
&lt;h2 id="min-max-反演"&gt;Min-Max 反演&lt;/h2&gt;
&lt;p&gt;令 \(\max\limits_{k}(S)\) 表示有限集 \(S\) 中的最大值，\(\min\limits_{k}(S)\) 表示有限集中的最小值。&lt;/p&gt;
&lt;h3 id="基本形式"&gt;基本形式&lt;/h3&gt;
\[
\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1}\min(T)
\]&lt;p&gt;可以发现，对于所有 \(T\subseteq S-\{\max(S)\}\)，均存在 \(T+\max(S)\subseteq S\) 与之一一对应，且 \(\min(T)=\min(T+\max(S))\)。 由于它们的大小恰好相差 \(1\)，故对每个集合 \(S\) 配上 \((-1)^{|S|}\) 的系数可以恰好它们消掉，最后仅剩下集合 \(\{\max(S)\}\)，它的最小值恰好等于 \(\max(S)\)。&lt;/p&gt;
&lt;p&gt;同理 ：&lt;/p&gt;
\[
\min(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1}\max(T)
\]&lt;h3 id="拓展形式"&gt;拓展形式&lt;/h3&gt;
\[
\max_k(S)=\sum_{T\subseteq S,|T|\geqslant k}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}\min(T)
\]&lt;p&gt;考虑 \(S\) 中的第 \(i\) 大数，它作为最小值被包含在大小为 \(|T|\) 的集合中共 \(\binom{i-1}{|T|-1}\) 次，每次出现会乘上 \(\binom{|T|-1}{k-1}\) 的权值，故一个数 \(\max\limits_{i}(S)\) 的总贡献为 ：&lt;/p&gt;
\[
\begin{aligned}
val_i&amp;=\max_i(S)\sum_{|T|=k}^i(-1)^{|T|-k}\dbinom{i-1}{|T|-1}\dbinom{|T|-1}{k-1}\\
&amp;=\max_i(S)\dbinom{i-1}{k-1}\sum_{|T|=k}^i(-1)^{|T|-k}\dbinom{i-k}{|T|-k}\\
&amp;=\max_i(S)\dbinom{i-1}{k-1}[i=k]
\end{aligned}
\]&lt;p&gt;所有数的贡献之和即为 \(\sum\limits_{i=1}^{|S|}val_{i}=\max\limits_{k}(S)\)，故原式成立。&lt;/p&gt;
&lt;p&gt;另外，由于期望具有线性性，所以上面的式子在期望意义下也成立。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我们来看看 \(\rm Min-Max\) 反演有什么应用：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
：你需要收集 \(n\) 种物品中的任意 \(k\) 种，每个时刻会有一种物品被生成，第 \(i\) 种物品被生成的概率为 \(\frac{p_{i}}{m}\)，如果你还没有收集这种物品则可以收集它，求你收集到这 \(n\) 个物品中任意 \(k\) 个的期望时间。&lt;/p&gt;
&lt;p&gt;保证 \(k\leqslant n\leqslant 10^{3},|n-k|\leqslant 10,0\leqslant p_{i}\leqslant m,\sum p=m,m\leqslant 10^{4}\)。&lt;/p&gt;
&lt;p&gt;首先可以发现所有物品出现的时间不重，故构成一个集合，所以题目要求的为 \(E\left(\max (S)_{k}\right)\)。&lt;/p&gt;
&lt;p&gt;套用拓展 \(\rm Min -Max\) 得到:&lt;/p&gt;
\[
E\left(\max (S)_{k}\right)=\sum_{T \subseteq S}\left(\begin{array}{c}
|T|-1 \\
k-1
\end{array}\right)(-1)^{|T|-k} E(\min (T))
\]&lt;p&gt;我们知道原来要求的是全集合中出现时间排第 \(k\) 的元素，由于变成了正过来看，此时的 \(k\) 变成了 \(n-k+ 1\) ，它的值非常小。&lt;/p&gt;
&lt;p&gt;我们知道一个集合每次操作出现一个属于它的元素的概率为:&lt;/p&gt;
\[
e(S)=\sum_{i \in S} \frac{p_{i}}{m}
\]&lt;p&gt;于是我们知道期望时间为:&lt;/p&gt;
\[
\sum_{i=1}^{\infty} e(S)(1-e(S))^{i-1}=\frac{1}{e(S)}
\]&lt;p&gt;于是现在我们得到了一个复杂度为 \(\Theta\left(2^{n}\right)\) 的做法，暴力枚举子集，对于每个集合求出此式子并计算贡献。&lt;/p&gt;
&lt;p&gt;然后我们来看这个式子:&lt;/p&gt;
\[
E\left(\max (S)_{k}\right)=\sum_{T \subseteq S}\left(\begin{array}{c}
|T|-1 \\
k-1
\end{array}\right)(-1)^{|T|-k} E(\min (T))
\]&lt;p&gt;考虑一个固定的集合大小 \(|T|\) ，其分配的系数相同均为 \(\left(\begin{array}{c}|T|-1 \ k-1\end{array}\right)(-1)^{|T|-k}\)&lt;/p&gt;
&lt;p&gt;则我们只需要求出 \(\sum_{|T|=x} E(\min (T))\)&lt;/p&gt;
&lt;p&gt;注意到 \(E(\min (T))=\frac{1}{e(S)}\)，于是我们可以给 \(d p\) 加一个维度记录 \(\sum p=e(S)\), 这样只需要统计有多少 个点满足 \(\sum p=i,|T|=j\)。&lt;/p&gt;
&lt;p&gt;于是不妨记 \(d p_{i, j, k}\) 表示考虑到前 \(i\) 个数，满足 \(|T|=j, \sum p=k\) 的集合数，则可以得到转移:&lt;/p&gt;
\[
d p_{i, j, k}=d p_{i-1, j, k}+d p_{i-1, j-1, k-p_{i}}
\]&lt;p&gt;这样便可以得到一个复杂度为 \(\Theta\left(n^{2} m\right)\) 的做法了。&lt;/p&gt;
&lt;p&gt;现在问题在于如何优化复杂度 \(?\)&lt;/p&gt;
&lt;p&gt;我们发现转移已经是最优了，不能从这里下手，于是只能从状态下手。由于 \(k\) 这一维附带了一个 \(\frac{1}{k}\)，于是肯定定是不能省略的，唯一的办法是把记录中的 \(|T|\) 给去掉试试。&lt;/p&gt;
&lt;p&gt;换而言之我们只统计到第 \(i\) 个数，任意放满足 \(\sum p=k\) 的数前面安排的系数之和。考虑系数为:&lt;/p&gt;
\[
\sum\left(\begin{array}{c}
|T|-1 \\
k-1
\end{array}\right)(-1)^{|T|-k}
\]&lt;p&gt;拆开试试 ?&lt;/p&gt;
\[
\sum \frac{(|T|-1) !}{(k-1) !(|T|-k) !}(-1)^{|T|-k}
\]&lt;p&gt;好像还是不行……&lt;/p&gt;
&lt;p&gt;但是这个时候可以得到转移大致为：&lt;/p&gt;
\[
d p_{i, j}=d p_{i-1, j}+\ldots
\]&lt;p&gt;这个奇怪的东西应该表示为:&lt;/p&gt;
&lt;p&gt;对于 \(d p_{i-1, j-p i}\) 的:&lt;/p&gt;
\[
\sum\left(\begin{array}{c}
|T|-1 \\
k-1
\end{array}\right)(-1)^{|T|-k}
\]&lt;p&gt;首先可以注意到所有 \(|T| \rightarrow|T|+1\) 于是整体需要乘一个 \(-1\)，注意到 \(|T| \rightarrow|T|+1\)，于是组合数变成了:&lt;/p&gt;
\[
\left(\begin{array}{c}
|T| \\
k-1
\end{array}\right)
\]&lt;p&gt;但是我们知道组合数可以递推所以有:&lt;/p&gt;
\[
\left(\begin{array}{c}
|T| \\
k-1
\end{array}\right)=\left(\begin{array}{c}
|T|-1 \\
k-1
\end{array}\right)+\left(\begin{array}{c}
|T|-1 \\
k-2
\end{array}\right)
\]&lt;p&gt;然而真正有趣的是这个式子可以放在一起一起递推，因为考虑计算 \(dp\) 时强制放入一个数则等价于 \(|T|\) 必然变大 \(1\)，于是我们可以给 \(dp\) 增加一个维度 \(k\) 来计算 \(dp\) 系数&lt;/p&gt;
\[
d p_{i, j, k}=d p_{i-1, j, k}+(-1) \times d p_{i-1, j-p i, k}+(-1)^{2} \times d p_{i-1, j-p i, k-1}
\]&lt;p&gt;即:&lt;/p&gt;
\[
d p_{i, j, k}=d p_{i-1, j, k}-d p_{i-1, j-p i, k}+d p_{i-1, j-p i, k-1}
\]&lt;p&gt;接下来考虑边界条件，这个好像有点难，因为我们的 \(dp\) 是按照转移的需求设计，所以它存在的实际意义也是为了方便转移而存在的。&lt;/p&gt;
&lt;p&gt;我们知道 \(d p_{0, j, k}\) 的意义应该是: \(\sum_{\sum p=j}\left(\begin{array}{c}|T|-1 \ k-1\end{array}\right)\)，于是考虑前面的数，唯一的一个 \(\sum p=j\) 是空集，即 \(\sum p=0\)，此时有 \(|T|=0\) 求的则是:&lt;/p&gt;
\[
dp_{0,0, k}=\dbinom{-1}{k-1}
\]&lt;p&gt;这个时候我们需要拓宽组合数的意义, 你可以认为 \(\binom{-1}{-1}=1\) 而 \(\binom{x}{y}\) 在 \(x\lt y\) 的时候为 \(0\)，\(x=y\) 的时候为 \(1\)。 所以 \(dp\) 的边界为 \(dp_{0,0,0}=1\)。&lt;/p&gt;
&lt;p&gt;转移的时候可以用滚动数组，总时间复杂度为 \(\Theta(nm(n-k))\)。&lt;/p&gt;
&lt;h3 id="gcd-lcm-反演"&gt;Gcd-Lcm 反演&lt;/h3&gt;
&lt;p&gt;一般地，求 \(\rm lcm\) 通常转化为求解 \(\gcd\)，因为 \(\gcd\) 的性质更为优秀，也可以借助莫比乌斯反演。&lt;/p&gt;
&lt;p&gt;通用形式为：&lt;/p&gt;
\[
\mathrm{lcm}(S) = \prod\limits_{T \subseteq S, T \ne \varnothing} \gcd(T) ^ {(-1) ^ {|T| - 1}}
\]&lt;p&gt;证明考虑使用 \(\rm Min-Max\) 容斥，考虑每个质因子 \(p\) 对左右的贡献：&lt;/p&gt;
\[
\begin{aligned}
p ^ {\max(p, S)} &amp;= p ^ {\sum\limits_{T \subseteq S, T \ne \varnothing} (-1) ^ {|T| - 1} \min(p, T)} \\
&amp;= \prod\limits_{T \subseteq S, T \ne \varnothing} p ^ {(-1) ^ {|T| - 1} \min(p, T)} \\
&amp;= \prod\limits_{T \subseteq S, T \ne \varnothing} \left(p ^ {\min(p, T)}\right) ^ {(-1) ^ {|T| - 1} }
\end{aligned}
\]&lt;p&gt;那么有：&lt;/p&gt;
\[
\begin{aligned}
\mathrm{lcm}(S) &amp;= \prod\limits_p p ^ {\max(p, S)} \\
&amp;= \prod\limits_{p} \prod\limits_{T \subseteq S, T \ne \varnothing} \left(p ^ {\min(p, T)}\right) ^ {(-1) ^ {|T| - 1} } \\
&amp;= \prod\limits_{T \subseteq S, T \ne \varnothing} \left(\prod\limits_p p ^ {\min(p, T)}\right) ^ {(-1) ^ {|T| - 1} } \\
&amp;= \prod\limits_{T \subseteq S, T \ne \varnothing} \gcd(T) ^ {(-1) ^ {|T| - 1}}
\end{aligned}
\]&lt;p&gt;&lt;strong&gt;我们来看看 \(\rm Gcd-Lcm\) 反演有什么应用：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前路（出题人：本校学长 @\(\rm remoon\)）:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;给定 \(A,B,C\)，求 ：&lt;/p&gt;
\[
\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\mathrm{lcm}(i,j,k)
\]&lt;p&gt;保证 \(A,B,C\leqslant 5\times 10^{4}\)，答案对 \(10^{9}+7\) 取模。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先给出一个复杂度估界为 \(\Theta(n^{2})\) 的做法，但实测非常快。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;请注意，以下的推导遵循一个原则，对 \(i, j, k\) 做相同变换，不会先处理一部分再处理一部分。&lt;/p&gt;
\[
\begin{aligned}
Ans &amp;= \sum\limits_{i = 1} ^ A \sum\limits_{j = 1} ^ B \sum\limits_{k = 1} ^ C \mathrm{lcm}(i, j, k) \\
&amp;= \sum\limits_{i = 1} ^ A \sum\limits_{j = 1} ^ B \sum\limits_{k = 1} ^ C \frac{ijk(i, j, k)}{(i, j)(j, k)(k, i)} \qquad (\mathrm{Min-Max} ~ for ~ index) \\
&amp;= \sum\limits_{i = 1} ^ A \sum\limits_{j = 1} ^ B \sum\limits_{k = 1} ^ C \frac{ijk}{(i, j)(j, k)(k, i)} \left( f \times \mu \times I \left((i, j, k)\right)\right) \qquad (f(i) = i)\\
&amp;= \sum\limits_{d = 1} ^ A f \times \mu (d) \sum\limits_{i = 1} ^ {A / d} \sum\limits_{i = 1} ^ {B / d} \sum\limits_{i = 1} ^ {C / d} \frac{ijk}{(i, j)(j, k)(k, i)}
\end{aligned}
\]&lt;p&gt;令 \(F(A, B, C) = \sum\limits_{i = 1}^{A} \sum\limits_{i = 1}^{B} \sum\limits_{i = 1}^{C} \dfrac{ijk}{(i, j)(j, k)(k, i)}, g(i) = \dfrac{1}{i}, h = g \times \mu\) 则：&lt;/p&gt;
\[
\begin{aligned}
F(A, B, C) &amp;= \sum\limits_{i = 1} ^ A \sum\limits_{i = 1} ^ B \sum\limits_{i = 1} ^ C ijk ( f \times \mu \times I ((i, j)))( f \times \mu \times I ((j, k)))( f \times \mu \times I ((k, i))) \\
&amp;= \sum\limits_{i = 1} ^ A \sum\limits_{i = 1} ^ B \sum\limits_{i = 1} ^ C ijk \sum\limits_{x \mid (i, j)} g \times \mu(x) \sum\limits_{y \mid (j, k)} g \times \mu(y) \sum\limits_{z \mid (k, i)} g \times \mu(z) \\
&amp;= \sum\limits_{x = 1} ^ A \sum\limits_{y = 1} ^ B \sum\limits_{z = 1} ^ C h(x) h(y) h(z) \sum\limits_{x, z \mid i} i \sum\limits_{x, y \mid j} j \sum\limits_{y, z \mid k} k \\
&amp;= \sum\limits_{x = 1} ^ A \sum\limits_{y = 1} ^ B \sum\limits_{z = 1} ^ C h(x) h(y) h(z) \sum\limits_{i = 1} ^ {A / \mathrm{lcm}(x, z)} i \times \mathrm{lcm}(x, z) \sum\limits_{j = 1} ^ {B / \mathrm{lcm}(x, y)} j \times \mathrm{lcm}(x, y) \sum\limits_{k = 1} ^ {C / \mathrm{lcm}(y, z)} k \times \mathrm{lcm}(y, z) \\
&amp;= \sum\limits_{x = 1} ^ A \sum\limits_{y = 1} ^ B \sum\limits_{z = 1} ^ C h(x) h(y) h(z) S(A, \mathrm{lcm}(x, z)) S(B, \mathrm{lcm}(x, y)) S(C, \mathrm{lcm}(y, z))
\end{aligned}
\]&lt;p&gt;可以发现，后者 \(x \rightarrow y \rightarrow z \rightarrow x\) 构成了一个三元环，我们可以大概给出估界为 \(\mathcal{O(n \log n \log \log n)}\)。 因此暴力找出所有三元环的复杂度为：\(\mathcal{O(n \log n \log \log n\sqrt{n \log n \log \log n})}\)。&lt;/p&gt;
&lt;p&gt;同时，因为这个在 \(n = 5000\) 时与 \(n^{2}\) 无区别，因此连边可以使用暴力。但也可以枚举 \(\mathrm{Lcm}\) 再枚举其约数，使用 \(\mathcal{O(n \log^{3n})}\) 连边。&lt;/p&gt;
&lt;p&gt;此时我们算完了 \(F\)，可知总共需要算的 \(F\) 只有 \(\sqrt{n}\) 种，若将单次复杂度看作 \(n^{2}\)，因此总复杂度：&lt;/p&gt;
\[
\mathcal{O(n ^ 2\sum\limits_{i = 1} ^ {n} \frac{1}{i ^ 2})} = O(n ^ 2)
\]&lt;p&gt;经过卡常之后，效率提升大约五倍多，以下是如何卡常的：&lt;/p&gt;
&lt;p&gt;我写了一个大范围内的打表程序，发现实际原做法的连边数量大约是 \(n \log n \log \log n\) 级别的，因此这个做法很有卡常前途。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们把暴力连边换掉，枚举其约数，使用 \(\mathcal{O(n \log^{3n})}\) 连边。连边暴力判断时不要求 \(\rm lcm\) 只需要求 \(\gcd(i / d_{j}, i / d_{k})\) 具体参见代码。如果你想要过本题，是一定要优化连边的。&lt;/li&gt;
&lt;li&gt;可以发现我们需要调用的 \(\rm lcm\) 只有每条边的两个端点，而在枚举 \(\rm Lcm\) 时是可以 \(\mathcal{O(1)}\) 得知的，因此我们在连边时记录这个值。&lt;/li&gt;
&lt;li&gt;可以发现，\(S\) 函数有很多是无用的，有用的第一维只有 \(\sqrt{A}\) 个，因此可以只预处理 \(A \sqrt{A}\) 个值。&lt;/li&gt;
&lt;li&gt;\(\gcd\) 请不要暴力求，我们记忆化 \(a, b \leqslant 2e4\) 的部分，并用 \(\rm short\) 类型存储，减少空间消耗。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;然后我们再给出一个复杂度为 \(\Theta(n^{1.5})\) 的正解做法。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;方便起见用 \((x, y)\) 代指 \(\operatorname{gcd}(x, y)\)&lt;/p&gt;
\[
\sum_{i=1}^{A} \sum_{j=1}^{B} \sum_{k=1}^{C} \frac{(i, j, k) i j k}{(i, j)(j, k)(i, k)}
\]&lt;p&gt;枚举 \(d\), 设 \(F(A, B, C)=\sum_{i=1}^{A} \sum_{j=1}^{B} \sum_{k=1}^{C} \frac{i j k}{(i, j)(j, k)(i, k)}\) 考虑计算:&lt;/p&gt;
\[
\sum_{d} \varphi(d) F\left(\frac{A}{d}, \frac{B}{d}, \frac{C}{d}\right)
\]&lt;p&gt;令 \(n=\max (A, B, C)\), 假定我们可以在 \(\mathcal{O}\left(n^{c} \log^{k} n\right)\) 的复杂度计算一组 \(F(A, B, C)\), 则当 \(c\gt 1\) 时，恒有 \(\sum \frac{1}{d^{c}}\) 是收敛的，可以认为其为常数。（不过比较大）&lt;/p&gt;
&lt;p&gt;只需要考虑快速计算一组 \(F(A, B, C)\), \(\rm remoon\) 给出的做法是同时反演三组，然后考虑通过三元环计数来计算答案，这里给出略为不同的思路:&lt;/p&gt;
\[
\begin{aligned}
&amp;F(A, B, C)=\sum_{i=1}^{A} \sum_{j=1}^{B} \sum_{k=1}^{C} \frac{i j k}{(i, j)(j, k)(i, k)} \\
&amp;=\sum_{k} k \sum_{d}(f * \mu)(d) \sum_{d \mid i}^{A} \frac{i}{\operatorname{gcd}(i, k)} \sum_{d \mid j}^{B} \frac{j}{\operatorname{gcd}(j, k)} \\
&amp;=\sum_{k} k \sum_{d}(f * \mu)(d) \frac{d^{2}}{\operatorname{gcd}(k, d)^{2}}\left(\sum_{i=1}^{A / d} \frac{i}{\operatorname{gcd}\left(i, \frac{k}{\operatorname{gcd}(k, d)}\right)}\right)\left(\sum_{i=1}^{B / d} \frac{i}{\operatorname{gcd}\left(i, \frac{k}{\operatorname{gcd}(k, d)}\right)}\right)
\end{aligned}
\]&lt;p&gt;不妨设 \(F(t, x)=\sum_{i \leq t} \frac{i}{\operatorname{gcd}(i, x)}\), 记 \(g(d)=(f * \mu)(d) d^{2}\)。&lt;/p&gt;
&lt;p&gt;答案等价于：&lt;/p&gt;
\[
\sum_{k}^{C} k \sum_{d} \frac{g(d)}{\operatorname{gcd}(k, d)^{2}} F\left(\frac{A}{d}, \frac{k}{\operatorname{gcd}(k, d)}\right) F\left(\frac{B}{d}, \frac{k}{\operatorname{gcd}(k, d)}\right)
\]&lt;p&gt;枚举 \(\frac{k}{\operatorname{gcd}(k, d)}\) 为 \(x\), 此时考虑到我们只需要计算 \(\mathcal{O}(n \sqrt{n})\) 组 \(F(n, x)\)。&lt;/p&gt;
&lt;p&gt;考虑到 \(F(n, x)\) 事实上就是:&lt;/p&gt;
\[
\begin{aligned}
&amp;\sum_{i=1}^{n} \frac{i}{\operatorname{gcd}(i, x)} \\
&amp;=\sum_{d \mid x}(f * \mu)(d) \times d S\left(\frac{n}{d}\right)
\end{aligned}
\]&lt;p&gt;枚举这 \(\sqrt{A}\) 种 \(n\), 可以发现后式就是一个高维前缀和的形式，可以在 \(\mathcal{O}\left(n^{1.5} \log \log n \sim n^{1.5} \log n\right)\) 的复杂度完成计算。 考虑前半部分，不妨枚举 \(d, \operatorname{gcd}(k, d)\) （设为 \(t\) ) 以及 \(x\), 此时我们知道:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;\(k=x t\), 故 \(x t \leq C\)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;\(t \mid d\)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;\(\operatorname{gcd}\left(\frac{d}{t}, x\right)=1\)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;固定了 \(\frac{A}{d}, \frac{B}{d}\) 之后，我们可以发现 \(d\) 属于区间 \([l, r]\), 此时我们考虑将答案差分，简而言之，我们的任务是计算 \(n \sqrt{n}\) 次下式:&lt;/p&gt;
\[
\begin{aligned}
&amp;x \sum_{d \leq R} g(d) \sum_{t \mid d} \frac{1}{t}[x t \leq C]\left[\operatorname{gcd}\left(x, \frac{d}{t}\right)=1\right] \\
&amp;=x \sum_{c \mid x} \mu(c) \sum_{c \mid d, d \leq R} g(d) \sum_{t \mid \frac{d}{\epsilon}} \frac{1}{t}\left[t \leq \frac{C}{x}\right]
\end{aligned}
\]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;首先，我们不难考虑到本质不同的 \(\frac{C}{x}\) 只有 \(\sqrt{n}\) 种，可以考虑枚举每种 \(\frac{C}{x}=m\) ，并在此时预处理:&lt;/p&gt;
\[
g(d) \sum_{t \mid d} \frac{1}{t}[t \leq m]
\]&lt;p&gt;对于某个 \(m\) ，这可以在 \(\mathcal{O}(n \log \log n)\) 的复杂度完成计算，总体而言，此部分可以在 \(\mathcal{O}\left(n^{1.5} \log \log n \sim n^{1.5} \log n\right)\) 完成预处理，设其为 \(G\left(d, \frac{C}{x}\right)\)。&lt;/p&gt;
&lt;p&gt;最后，让我们为每个 \(c\) 考虑，穷举可能的 \(\sqrt{n}\) 种 \(m\) ，并为每个 \(c\) 建立大小为 \(\frac{\max R}{c}\) 的表格，显然表格的总大小为 \(n \log n\), 此时单组查询显然可以做到 \(\mathcal{O}(1)\), 由于 \(x\) 穷举 \(1 \sim n\) ，考察其约数个数和显然为 \(\mathcal{O}(n \log n)\), 总体而言我们可以在 \(\mathcal{O}\left(n^{1.5} \log n\right)\) 解决此问题。&lt;/p&gt;
&lt;p&gt;一点新的思路:&lt;/p&gt;
&lt;p&gt;我们考虑枚举 \(c\), 并为每个 \(c\), 对 \(\frac{C / c}{x}\) 的所有可能的取值进行预处理，不难发现这个部分的复杂度为 \(\sum\left(\frac{n}{c}\right)^{1.5}\)。&lt;/p&gt;
&lt;p&gt;通过积分不难证明这部分等效于 \(n^{1.5}\)。&lt;/p&gt;
&lt;h2 id="莫比乌斯反演"&gt;莫比乌斯反演&lt;/h2&gt;
&lt;h3 id="一些定义和性质"&gt;一些定义和性质&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;\(\rm Dirichlet\) 卷积 :&lt;/strong&gt; \(\sum\limits_{d|n}f(d)g(\frac{n}{d})\) 被定义为 \(\rm Dirichlet\) 卷积。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;莫比乌斯 \((\mu)\) 函数 :&lt;/strong&gt;&lt;/p&gt;
\[
\mu(n)=
\begin{cases}
1 &amp; n=1 \\
0 &amp; n \text{ 含有平方因子 } \\
(-1)^k &amp; k \text{ 为 } n \text{ 的本质不同质因子个数 }
\end{cases}
\]&lt;p&gt;显然，\(\mu\) 是积性函数，且它还有一些更加巧妙的性质，其中最常用的一个是 \(\mu \times 1=\varepsilon\)。&lt;/p&gt;
&lt;p&gt;\(\large\rm Proof:\)&lt;/p&gt;
&lt;p&gt;此处的乘号表示 \(\rm Dirichlet\) 卷积，\(1\) 表示常数函数 \(\forall x\in [1,+\infty),f(x)=1\)，\(\varepsilon\) 表示单位函数 \(\forall x\in [1,+\infty),f(x)=[x=1]\)。&lt;/p&gt;
&lt;p&gt;设 \(n=\prod_{i=1}^{k} p_{i}^{c_{i}}, n^{\prime}=\prod_{i=1}^{k} p_{i}\)。&lt;/p&gt;
&lt;p&gt;那么 \(\sum\limits_{d \mid n} \mu(d)=\sum\limits_{d \mid n^{\prime}} \mu(d)=\sum\limits_{i=0}^{k}\tbinom{k}{i}\cdot(-1)^{i}=(1+(-1))^{k}\)。&lt;/p&gt;
&lt;p&gt;根据二项式定理，易知该式子的值在 \(k=0\) 即 \(n=1\) 时值为 \(1\) 否则为 \(0\)，这也同时证明了 \(\sum\limits_{d \mid n} \mu(d)=[n=1]=\varepsilon(n)\) 以及 \(\mu * 1=\varepsilon\)。&lt;/p&gt;
&lt;h3 id="两个反演式子"&gt;两个反演式子&lt;/h3&gt;
\[
[n=1]=\sum_{d|n}\mu(d)
\]&lt;p&gt;\(\large\rm Proof:\)&lt;/p&gt;
\[
[n=1]=\varepsilon(n)=\mu \times 1(n)=\sum_{d|n}\mu(d)
\]&lt;p&gt;&lt;strong&gt;我们来看看这个式子有什么应用：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
给定一个长度为 \(n\) 的序列 \(a\)，给定 \(m\) 个询问 \(l,r,x\)，求 \(a_{l},a_{l+1}......a_{r}\) 中有多少个数与 \(x\) 互质。&lt;/p&gt;
&lt;p&gt;保证 \(n,m,a_{i},x\leqslant 10^{5}\)。&lt;/p&gt;
&lt;p&gt;考虑莫比乌斯反演: \(\left[\left(a_{i}, x\right)=1\right]=\sum\limits_{\left.d \mid a_{i}, x\right)} \mu(d)=\sum\limits_{d\left|a_{i}, d\right| x} \mu(d)\)。&lt;/p&gt;
&lt;p&gt;由于答案求 \(\sum\limits_{i=l}^{r}\left[\left(a_{i}, x\right)=1\right]=\sum\limits_{i=l}^{r} \sum\limits_{d\left|a_{i}, d\right| x} \mu(d)=\sum\limits_{d \mid x} \mu(d) \sum\limits_{i=l}^{r}\left[d \mid a_{i}\right]_{\text {.}}\)&lt;/p&gt;
&lt;p&gt;考虑对于每一个数, 预处理出它的倍数出现在哪些位置, 然后询问时枚举所有 \(x\) 的因数, 二分一下即可求出 \([l, r]\) 内它的倍数有多少个。时间复杂度 \(\Theta(n \sigma(\operatorname{maxa}) \log n)\)。&lt;/p&gt;
&lt;p&gt;考虑对上述算法进行优化 ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们可以只考虑 \(\mu\) 值不等于 \(0\) 的因数。&lt;/li&gt;
&lt;li&gt;考虑预处理出小于 \(\sqrt{maxa}\) 的所有因数的前缀和，这样对于这些因数的询问是 \(\Theta(1)\) 的。&lt;/li&gt;
&lt;li&gt;考虑我们相当于要求 \(q\) 个询问不大于 \(x\) 的为某个数的倍数的方案数。先将这些点排个序，然后就可以直接 \(\rm two\ pointers\) 求。时间复杂度可以降到 \(\Theta(n\sigma(maxa))\)。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三者实现其一即可通过本题。&lt;/p&gt;
\[
f(n)=\sum_{d|n}g(d)\iff g(n)=\sum_{d|n}\mu(d)f\left(\frac{n}{d}\right)
\]&lt;p&gt;\(\large\rm Proof:\)&lt;/p&gt;
\[
\because f=g\times I
\]\[
\therefore f\times \mu=g\times I \times \mu
\]\[
\therefore f\times \mu=g\times \varepsilon = g
\]&lt;p&gt;&lt;strong&gt;我们来看看这个式子有什么应用：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
给出 \(n\) 个询问，每个询问给定 \(5\) 个整数 \(a,b,c,d,k\)，求 ：&lt;/p&gt;
\[
\sum_{i=a}^{b}\sum_{j=c}^d[\gcd(i,j)=k]
\]&lt;p&gt;保证 \(n,a,b,c,d,k\leqslant 5\times 10^{4}\)。&lt;/p&gt;
&lt;p&gt;根据容斥原理, 原式可以分成 \(4\) 块来处理，每一块的式子都形如 ：&lt;/p&gt;
\[
\sum_{i=1}^{n} \sum_{j=1}^{m}[\operatorname{gcd}(i, j)=k]
\]&lt;p&gt;考虑化简该式子 ：&lt;/p&gt;
\[
\sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor} \sum_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}[\operatorname{gcd}(i, j)=1]
\]&lt;p&gt;因为 \(\operatorname{gcd}(i, j)=1\) 时对答案才有贡献，于是我们可以将其替换为 \(\varepsilon(\operatorname{gcd}(i, j))\)，故原式化为 ：&lt;/p&gt;
\[
\sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor} \sum_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor} \varepsilon(\operatorname{gcd}(i, j))
\]&lt;p&gt;将 \(\varepsilon\) 函数展开得到 ：&lt;/p&gt;
\[
\sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor} \sum_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor} \sum_{d \mid \operatorname{gcd}(i, j)} \mu(d)
\]&lt;p&gt;变换求和顺序, 先枚举 \(d \mid \operatorname{gcd}(i, j)\) 可得 ：&lt;/p&gt;
\[
\sum_{d=1}^{\min \left(\left\lfloor\frac{n}{k}\right\rfloor,\left\lfloor\frac{m}{k}\right\rfloor\right)} \mu(d) \sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}[d \mid i] \sum_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}[d \mid j]
\]&lt;p&gt;易知 \(1 \sim\left\lfloor\frac{n}{k}\right\rfloor\) 中 \(d\) 的倍数有 \(\left\lfloor\frac{n}{k d}\right\rfloor\) 个, 故原式化为 ：&lt;/p&gt;
\[
\sum_{d=1}^{\min \left(\left\lfloor\frac{n}{k}\right\rfloor,\left\lfloor\frac{m}{k}\right\rfloor\right)} \mu(d)\left\lfloor\frac{n}{k d}\right\rfloor\left\lfloor\frac{m}{k d}\right\rfloor
\]&lt;p&gt;很显然，式子可以数论分块求解。&lt;/p&gt;
&lt;p&gt;时间复杂度 \(\Theta(W+n\sqrt{W})\)。&lt;/p&gt;
&lt;h3 id="莫比乌斯反演的非卷积形式"&gt;莫比乌斯反演的非卷积形式&lt;/h3&gt;
&lt;p&gt;对于数论函数 \(f,g\) 和完全积性函数 \(t\)，满足 \(t(1)=1\)，有 ：&lt;/p&gt;
\[
f(n)=\sum_{i=1}^nt(i)g\left(\left\lfloor\frac{n}{i}\right\rfloor\right)\ \iff g(n)=\sum_{i=1}^n\mu(i)t(i)f\left(\left\lfloor\frac{n}{i}\right\rfloor\right)
\]&lt;p&gt;\(\large\rm Proof:\)&lt;/p&gt;
\[
\begin{aligned}
g(n) &amp;= \sum_{i=1}^n\mu(i)t(i)f\left(\left\lfloor\frac{n}{i}\right\rfloor\right) \\
&amp;= \sum_{i=1}^n\mu(i)t(i) \sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}t(j) g\left(\left\lfloor\frac{\left\lfloor\frac{n}{i}\right\rfloor}{j}\right\rfloor\right) \\
&amp;= \sum_{i=1}^n\mu(i)t(i) \sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}t(j) g\left(\left\lfloor\frac{n}{ij}\right\rfloor\right) \\
&amp;= \sum_{T=1}^n \sum_{i=1}^n\mu(i)t(i) \sum_{j=1}^{\left\lfloor\frac{n}{i}\right\rfloor}[ij=T] t(j)g\left(\left\lfloor\frac{n}{T}\right\rfloor\right) \\
&amp;= \sum_{T=1}^n \sum_{i \mid T}\mu(i)t(i) t\left(\frac{T}{i}\right)g\left(\left\lfloor\frac{n}{T}\right\rfloor\right) \\
&amp;= \sum_{T=1}^n g\left(\left\lfloor\frac{n}{T}\right\rfloor\right) \sum_{i \mid T}\mu(i)t(i)t\left(\frac{T}{i}\right) \\
&amp;= \sum_{T=1}^n g\left(\left\lfloor\frac{n}{T}\right\rfloor\right) \sum_{i \mid T}\mu(i)t(T) \\
&amp;= \sum_{T=1}^n g\left(\left\lfloor\frac{n}{T}\right\rfloor\right)t(T) \sum_{i \mid T}\mu(i) \\
&amp;= \sum_{T=1}^n g\left(\left\lfloor\frac{n}{T}\right\rfloor\right)t(T) \varepsilon(T) \\
&amp;= g(n)t(1) \\
&amp;= g(n)
\end{aligned}
\]</description></item><item><title>线性同余方程</title><link>https://sichen-wang.github.io/blog/%E7%BA%BF%E6%80%A7%E5%90%8C%E4%BD%99%E6%96%B9%E7%A8%8B/</link><pubDate>Sat, 24 Jun 2023 11:00:56 +0000</pubDate><guid>https://sichen-wang.github.io/blog/%E7%BA%BF%E6%80%A7%E5%90%8C%E4%BD%99%E6%96%B9%E7%A8%8B/</guid><description>&lt;p&gt;考虑如何求解以下方程 ：&lt;/p&gt;
\[
ax\equiv 1\pmod b
\]&lt;p&gt;显然可以转化为 ：&lt;/p&gt;
\[
ax+by=1
\]&lt;p&gt;有裴蜀定理 :&lt;/p&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;对于不定方程 \(ax+by=c\)，其有解当且仅当 \(\gcd(a,b)|c\)。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可以发现上述方程有解当且仅当 \(\gcd(a,b)=1\)，故可以转化为 ：&lt;/p&gt;
\[
ax+by=\gcd(a,b)
\]&lt;p&gt;观察到当 \(b=0\) 时方程有特解 \(x=1,y=0\)，于是考虑如何递归求解。&lt;/p&gt;
&lt;p&gt;因为上式中有辗转相除的影子，于是尝试构造 ：&lt;/p&gt;
\[
bx'+(a~mod~b)y'=\gcd(b,a~mod~b)
\]&lt;p&gt;有 \(a\ mod\ b=a-\lfloor\frac{a}{b}\rfloor b\)，化简可得 ：&lt;/p&gt;
\[
ay'+b\left(x'-\lfloor\frac{a}{b}\rfloor y'\right)=\gcd(b,a~mod~b)=
\gcd(a,b)
\]&lt;p&gt;于是我们发现，如果求出了方程 \(bx'+(a\ mod\ b)y'=\gcd(b,a\ mod\ b)\) 的解 \(x'\) 和 \(y'\)，那么方程 \(ax+by=\gcd(a,b)\) 的解为 ：&lt;/p&gt;
\[
x=y',y=x'-\lfloor\frac{a}{b}\rfloor y'
\]&lt;p&gt;于是这样就可以在辗转相除的过程中递归求解了，时间复杂度 \(\Theta(\log n)\)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&amp;lt;bits/stdc++.h&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Exgcd&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Exgcd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cin&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Exgcd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>线性筛</title><link>https://sichen-wang.github.io/blog/%E7%BA%BF%E6%80%A7%E7%AD%9B/</link><pubDate>Sat, 24 Jun 2023 11:00:56 +0000</pubDate><guid>https://sichen-wang.github.io/blog/%E7%BA%BF%E6%80%A7%E7%AD%9B/</guid><description>&lt;h2 id="筛素数"&gt;筛素数&lt;/h2&gt;
&lt;p&gt;考虑如何筛出 \(n\) 以内的所有素数，显然有一个最简单的想法，即将所有已求出的质数的倍数标记，表示它们不为质数，并且从小到大遍历到数 \(i\) 时，若它没有被标记，则 \(i\in Prime\)。 在此算法中，每个数都被自己所有本质不同的质因子筛了一次，所以总复杂度为 \(\Theta(n\ln \ln n)\)。&lt;/p&gt;
&lt;p&gt;对于上面的算法，算力的浪费主要在于很多数被多个质数筛过，我们考虑让每个数都只被自己的最小质因子筛。当遍历到 \(i\) 时，枚举已经筛出来的所有质数，若当前枚举的质数为 \(p_{j}\)，显然 \(i\times p_{j}\) 不为质数。另一方面，若 \(p_{j}|i\)，则 \(i\) 中有一个质因子 \(p_{j}\)，那么后面枚举到 \(p_{j+1}\) 的时候，\(p_{j+1}\) 就一定不是 \(i\times p_{j+1}\) 的最小质因子，所以此时要停止枚举质数。这样，每个数都只被自己的最小质因子筛过，所以总复杂度为 \(\Theta(n)\)。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="筛欧拉函数"&gt;筛欧拉函数&lt;/h2&gt;
&lt;p&gt;考虑到 \(\varphi\) 函数有如下性质：&lt;/p&gt;
\[
\begin{cases}
\varphi(p) = p - 1 &amp; p \in Prime \\
\varphi(ap) = \varphi(a) \times p &amp; p \in Prime \\
\varphi(ab) = \varphi(a) \times \varphi(b) &amp; \gcd(a, b) = 1
\end{cases}
\]&lt;ul&gt;
&lt;li&gt;对于 \(\varphi(p),p\in Prime\)，直接在筛出质数的同时求解即可。&lt;/li&gt;
&lt;li&gt;对于 \(\varphi(ap),p\in Prime\)，在 \(p_{j}|i\) 时，\(\varphi(i\times p_{j})=\varphi(i)\times p_{j}\)。&lt;/li&gt;
&lt;li&gt;对于 \(\varphi(ab),\gcd(a,b)=1\)，直接在筛去合数的时候 \(\varphi(i\times p_{j})=\varphi(i)\times \varphi(p_{j})\)。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="筛不同质因子的个数"&gt;筛不同质因子的个数&lt;/h2&gt;
&lt;p&gt;令 \(\alpha(x)\) 表示 \(x\) 不同质因子的个数，\(\beta(x)\) 表示 \(x\) 的所有最小质因子的乘积，考虑到 \(\alpha\) 函数有如下性质：&lt;/p&gt;
\[
\begin{cases}
\alpha(p^k) = 1 &amp; p \in Prime \\
\alpha(ab) = \alpha(a) + \alpha(b) &amp; \gcd(a, b) = 1 \\
\alpha(ap) = \alpha\left(\frac{a}{\beta(a)}\right) + 1 &amp; p \text{ 为 } a \text{ 的最小质因子}
\end{cases}
\]&lt;p&gt;于是用与筛欧拉函数相似的方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;vis&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>