浅谈欧拉繁衍的证明及例题

· · 个人记录

果果要求掌握的东西当然是要掌握的咯。

最终形式

\Large{n=\sum_{d|n}^{}}{\varphi(d)}

证明

\large\because n=\sum_{d|n}\sum_{j=1}^{n}{[\gcd(j,n)=d]}

解释一下,首先,这里的 \gcd(j,n) 一定是只有一个值,不可能说有两个不同的值来自同一个 \gcd(j,n) ;其次,为什么这一坨东西等于 n 呢,因为其一说的每个 \gcd 都有唯一确定的值,因此我们只需要枚举 \gcd 的每种可能并枚举所有 n 以内的正整数就必然有且仅有一种可能的 d 满足每组 \gcd(j,n)=d
换句话说,因为一个 \gcd(j,n) 只对应唯一一个 d ,这里我们把所有可能的 \gcd 的值和所有的 j 都枚举了自然其值也就等于 n 了(主要就是说明一个不重也不漏)。

\large\therefore \ n=\sum_{d|n}\sum_{j=1}^{\frac{n}{d}}{[\gcd(j,\frac{n}{d})=1]}

这里没什么好说的,目的是把 \gcd 的值化为 1 后能转化成欧拉函数的形式。

\large\therefore n=\sum_{d|n}{\varphi(\frac{n}{d})} \large\therefore n=\sum_{d|n}{\varphi(d)}

这里是因为每个 \frac{n}{d}d 是对应的,所以能如此转化。

例题

利用欧拉反演,改变题目公式如下:

\sum_{i=1}^{n}{\sum_{d|\gcd(i,n)}{\varphi(d)}}

拆开 \gcd 得:

\sum_{i=1}^{n}{\sum_{d|i,d|n}{\varphi(d)}}

改变循环顺序得:

\sum_{d|n}\varphi(d)\sum_{i=1}^{n}[d|i]

化简得:

\sum_{d|n}\varphi(d)\frac{n}{d}

关于推导式子就没了。这时只需将 \text{phi} 预处理,每次询问 \sqrt{n} 复杂度。

先排序,可得以下原公式:

\sum_{i=1}^{n}\sum_{j=1}^{i-1}\gcd(a_i,a_j)(n-i)

带入欧拉反演如下:

\sum_{i=1}^{n}\sum_{j=1}^{i-1}(\sum_{d|\gcd(a_i,a_j)}{\varphi(d)})(n-i)

化简:

\sum_{i=1}^{n}(n-i)\sum_{j=1}^{i-1}\sum_{d|a_i,d|a_j}{\varphi(d)} \sum_{i=1}^{n}(n-i)\sum_{d|a_i}\varphi(d)\sum_{j=1}^{i-1}[d|a_j] \sum_{i=1}^{n}(n-i)\sum_{d|a_i}\varphi(d)\cdot cnt_{d}

其中我们可以边枚举 i 边处理 cnt_d ,并预处理 \varphi(x) 。因此总时间复杂度为 O(M+TN\sqrt{M})M 表示 a_i 的值域,还会有一些小常数,会有点卡常。