[ P ] = { 1 , if the proposition P is true 0 , if the proposition P is false [P] =
\begin{cases}
1,&\text{if the proposition } P \text{ is true}\\
0,&\text{if the proposition } P \text{ is false}
\end{cases} [ P ] = { 1 , 0 , if the proposition P is true if the proposition P is false
集合的表示:
S = { x : P } S = \{x:P\} S = { x : P }
表示满足条件 P P P 的 x x x 构成的集合
指一类函数:其定义域为 N ∗ \mathbb N^* N ∗ ,值域为某个数集。
两个数论函数的加法:
( f + g ) ( n ) = f ( n ) + g ( n ) (f+g)(n) = f(n) + g(n) ( f + g ) ( n ) = f ( n ) + g ( n )
逐项相加即可。
数乘:
( c f ) ( n ) = c ( f ( n ) ) (cf)(n) = c(f(n)) ( c f ) ( n ) = c ( f ( n ) )
两个数论函数的狄利克雷卷积(用 ∗ * ∗ 表示):
( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) × g ( n d ) = ∑ d 1 × d 2 = n f ( d 1 ) × f ( d 2 ) \begin{aligned}
(f*g)(n) &= \sum_{d\mid n}f(d)\times g\left(\frac n d\right)\\
&= \sum_{d_1 \times d_2 = n}f(d_1)\times f(d_2)
\end{aligned} ( f ∗ g ) ( n ) = d ∣ n ∑ f ( d ) × g ( d n ) = d 1 × d 2 = n ∑ f ( d 1 ) × f ( d 2 )
注意狄利克雷卷积其实就是关于乘法的卷积(d 1 d 2 = n d_1d_2=n d 1 d 2 = n )。
其具有如下性质:
交换律:f ∗ g = g ∗ f f*g = g*f f ∗ g = g ∗ f ,乘法满足交换律,得证。
结合律:( f ∗ g ) ∗ h = f ∗ ( g ∗ h ) (f*g)*h=f*(g*h) ( f ∗ g ) ∗ h = f ∗ ( g ∗ h ) :
∑ ( i j ) k = n ( f ( i ) g ( j ) ) h ( k ) = ∑ i ( j k ) = n f ( i ) ( g ( j ) h ( k ) ) \sum_{(ij)k = n}(f(i)g(j))h(k)=\sum_{i(jk) = n}f(i)(g(j)h(k)) ( i j ) k = n ∑ ( f ( i ) g ( j ) ) h ( k ) = i ( j k ) = n ∑ f ( i ) ( g ( j ) h ( k ) )
对加法的分配律:( f + g ) ∗ h = f ∗ h + g ∗ h (f+g)*h = f*h + g*h ( f + g ) ∗ h = f ∗ h + g ∗ h :
( f ( n ) + g ( n ) ) ∗ h ( n ) = ∑ d ∣ n ( f ( d ) + d ( d ) ) h ( n d ) = ∑ d ∣ n f ( d ) h ( n d ) + ∑ d ∈ n g ( d ) h ( n d ) = f ( n ) ∗ h ( n ) + g ( n ) ∗ h ( n ) \begin{aligned}
&(f(n) + g(n)) * h(n)\\
=&\sum_{d\mid n}(f(d) + d(d))h\left(\frac nd\right)\\
=&\sum_{d\mid n}f(d)h\left(\frac nd\right) + \sum_{d\in n}g(d)h\left(\frac nd\right)\\
=&f(n)*h(n) + g(n)*h(n)
\end{aligned} = = = ( f ( n ) + g ( n ) ) ∗ h ( n ) d ∣ n ∑ ( f ( d ) + d ( d ) ) h ( d n ) d ∣ n ∑ f ( d ) h ( d n ) + d ∈ n ∑ g ( d ) h ( d n ) f ( n ) ∗ h ( n ) + g ( n ) ∗ h ( n )
与数乘的结合律:( c f ) ∗ g = c ( f ∗ g ) (cf)*g = c(f*g) ( c f ) ∗ g = c ( f ∗ g )
单位元 :ϵ ∗ f = f \epsilon * f = f ϵ ∗ f = f ,ϵ ( n ) = [ n = 1 ] \epsilon(n) = [n = 1] ϵ ( n ) = [ n = 1 ] 。即这个单位元函数当 n = 1 n = 1 n = 1 时返回 1 1 1 ,当 n ≠ 1 n\not=1 n = 1 时返回 0 0 0 。
f ∗ ϵ = ∑ d ∣ n f ( d ) ϵ ( n d ) \begin{aligned}
f * \epsilon &= \sum_{d\mid n} f(d)\epsilon\left(\frac nd\right)
\end{aligned} f ∗ ϵ = d ∣ n ∑ f ( d ) ϵ ( d n )
不难验证其正确性:只有当 d = n d = n d = n 时 ϵ ( n / d ) \epsilon(n/d) ϵ ( n / d ) 才等于 1 1 1 ,只保留了 f ( n ) f(n) f ( n ) 这一项。
狄利克雷逆元:f − 1 ∗ f = ϵ f^{-1}*f=\epsilon f − 1 ∗ f = ϵ 。考虑如何求这个逆元:
ϵ = f − 1 ∗ f ϵ = ∑ d ∣ n f − 1 ( d ) f ( n d ) ϵ ( n ) = f − 1 ( n ) f ( 1 ) + ∑ d ∣ n ∧ d < n f − 1 ( d ) f ( n d ) f − 1 ( n ) = 1 f ( 1 ) ( ϵ ( n ) − ∑ d ∣ n ∧ d < n f − 1 ( d ) f ( n d ) ) \begin{aligned}
\epsilon &= f^{-1}*f\\
\epsilon &= \sum_{d\mid n}f^{-1}(d)f\left(\frac nd\right)\\
\epsilon(n) &= f^{-1}(n)f(1) + \sum_{d\mid n\land d < n} f^{-1}(d)f\left(\frac nd\right)\\
f^{-1}(n) &=\frac1{f(1)}\left(\epsilon(n) – \sum_{d\mid n\land d < n} f^{-1}(d)f\left(\frac nd\right)\right)
\end{aligned} ϵ ϵ ϵ ( n ) f − 1 ( n ) = f − 1 ∗ f = d ∣ n ∑ f − 1 ( d ) f ( d n ) = f − 1 ( n ) f ( 1 ) + d ∣ n ∧ d < n ∑ f − 1 ( d ) f ( d n ) = f ( 1 ) 1 ⎝ ⎛ ϵ ( n ) − d ∣ n ∧ d < n ∑ f − 1 ( d ) f ( d n ) ⎠ ⎞
于是这个逆元就被求出来了。不难发现只要 f f f 满足 f ( 1 ) ≠ 0 f(1)\not=0 f ( 1 ) = 0 ,其就会具有逆元
狄利克雷卷积就是研究函数的乘法结构
首先我们有算术基本定理
n = ∏ k = 1 ω ( n ) p k a k n=\prod_{k = 1}^{\omega(n)} p_k^{a_k} n = k = 1 ∏ ω ( n ) p k a k
注意到此时 ω ( n ) \omega(n) ω ( n ) 描述了一个数 n n n 的约数种类数
定义欧米茄函数
Ω ( n ) = ∑ k = 1 ω ( n ) a k \Omega(n) = \sum_{k = 1}^{\omega(n)} a_k Ω ( n ) = k = 1 ∑ ω ( n ) a k
它描述了一个数约数的总个数。
有了如上定义,我们就可以引入莫比乌斯函数了:
μ ( n ) = 1 − 1 ( n ) = [ ω ( n ) = Ω ( n ) ] × ( − 1 ) ω ( n ) \mu(n) = 1^{-1}(n) = [\omega(n) =\Omega(n)]\times (-1)^{\omega(n)} μ ( n ) = 1 − 1 ( n ) = [ ω ( n ) = Ω ( n ) ] × ( − 1 ) ω ( n )
其中 1 1 1 的意义为常函数 f ( n ) = 1 f(n) = 1 f ( n ) = 1 。
分析一下这个神奇的定义:
首先,此处定义莫比乌斯函数为 1 1 1 的逆元 ,注意到其具有如下性质
∑ d ∣ n μ ( d ) = { 1 , n = 1 0 , n ≠ 1 \sum_{d\mid n}\mu(d) =
\begin{cases}
1,&n = 1\\
0,&n\not= 1
\end{cases} d ∣ n ∑ μ ( d ) = { 1 , 0 , n = 1 n = 1
证明:设 n ′ = ∏ k = 1 ω p k n' = \displaystyle\prod_{k=1}^{\omega}p_k n ′ = k = 1 ∏ ω p k ,不难发现
∑ d ∣ n μ ( d ) = ∑ d ∣ n ′ μ ( d ) = ∑ k = 0 ω ( ω k ) ( − 1 ) k = ( 1 + ( − 1 ) ) ω \sum_{d\mid n}\mu(d) = \sum_{d\mid n'}\mu(d) = \sum_{k = 0}^\omega \binom{\omega}{k}(-1)^k = (1 + (-1))^\omega d ∣ n ∑ μ ( d ) = d ∣ n ′ ∑ μ ( d ) = k = 0 ∑ ω ( k ω ) ( − 1 ) k = ( 1 + ( − 1 ) ) ω
根据二项式定理,发现 ω = 0 \omega = 0 ω = 0 即 n = 1 n = 1 n = 1 时式子为 1 1 1 ,否则为 0 0 0 。
所以我们知道 μ ∗ 1 = ϵ \mu*1 = \epsilon μ ∗ 1 = ϵ
其次,分析后面的那坨式子:
ω ( n ) = Ω ( n ) \omega(n) = \Omega(n) ω ( n ) = Ω ( n ) 如果不成立,说明整个函数值就为 0 0 0 了。即 n n n 具有平方因子
如果 n = 1 n = 1 n = 1 ,则显然 μ ( 1 ) = 1 \mu(1) = 1 μ ( 1 ) = 1
如果 ω ( n ) = Ω ( n ) \omega(n) = \Omega(n) ω ( n ) = Ω ( n ) 成立,那么函数的值即取决于函数具有奇数个还是偶数个质因子,前者 − 1 -1 − 1 ,后者 1 1 1
很重要的一点:
i d k ∗ t = ϵ \mathrm{id}^k * t = \epsilon i d k ∗ t = ϵ
其中 i d k ( n ) = n k \mathrm{id}^k(n) = n^k i d k ( n ) = n k , t ( n ) = μ ( n ) n k t(n) = \mu(n)n^k t ( n ) = μ ( n ) n k
简证:
( i d k ∗ t ) ( n ) = ∑ d ∣ n d k μ ( n d ) ( n d ) k = n k ∑ d ∣ n μ ( n d ) = n k ϵ ( n ) = ϵ ( n ) \begin{aligned}
&(\mathrm{id}^k*t)(n)\\
=&\sum_{d\mid n}d^k\mu\left(\frac n d\right)\left(\frac nd\right)^k\\
=&n^k\sum_{d\mid n}\mu\left(\frac n d\right)\\
=&n^k\epsilon(n)\\
=&\epsilon(n)
\end{aligned} = = = = ( i d k ∗ t ) ( n ) d ∣ n ∑ d k μ ( d n ) ( d n ) k n k d ∣ n ∑ μ ( d n ) n k ϵ ( n ) ϵ ( n )
还有:ϕ = μ ∗ i d \phi = \mu * \mathrm{id} ϕ = μ ∗ i d ,简证:
( μ ∗ i d ) ( n ) = ∑ d ∣ n μ ( d ) ( n d ) = ∑ d ∣ n μ ( n d ) d = ∑ d = 1 n [ d ∣ n ] μ ( n d ) d \begin{aligned}
&(\mu*\mathrm{id})(n)\\
=&\sum_{d\mid n}\mu(d)\left(\frac nd\right)\\
=&\sum_{d\mid n}\mu\left(\frac nd\right)d\\
=&\sum_{d = 1}^n[d\mid n]\mu\left(\frac nd\right)d\\
\end{aligned} = = = ( μ ∗ i d ) ( n ) d ∣ n ∑ μ ( d ) ( d n ) d ∣ n ∑ μ ( d n ) d d = 1 ∑ n [ d ∣ n ] μ ( d n ) d
再来看看容斥原理:
∣ ⋃ i = 1 n S i ∣ = ∑ T ⊆ { 1 , 2 , ⋯ , n } ( − 1 ) ∣ T ∣ − 1 ∣ ⋂ j ∈ T S j ∣ \left|\bigcup_{i=1}^nS_i\right|=\sum_{T\subseteq\{1,2,\cdots,n\}}(-1)^{|T| – 1}\left|\bigcap_{j\in T}S_j\right| ∣ ∣ ∣ ∣ ∣ ∣ i = 1 ⋃ n S i ∣ ∣ ∣ ∣ ∣ ∣ = T ⊆ { 1 , 2 , ⋯ , n } ∑ ( − 1 ) ∣ T ∣ − 1 ∣ ∣ ∣ ∣ ∣ ∣ ∣ j ∈ T ⋂ S j ∣ ∣ ∣ ∣ ∣ ∣ ∣
其描述的就是多个集合的并内的元素个数应该如何计算。
证明:考虑一个任意一个元素 x x x 在 k k k 个集合 S i S_i S i 中,则在选取的时候:
选取集合个数为 1 1 1 时,这个元素被加了 k k k 次
选取集合个数为 2 2 2 时,这个元素被减了 ( k 2 ) \displaystyle\binom k 2 ( 2 k ) 次,因为一共是存在 ( k 2 ) \displaystyle\binom k 2 ( 2 k ) 种选法使得选出的两个集合内包含 x x x
选取集合个数为 3 3 3 时,这个元素又被加了 ( k 3 ) \displaystyle\binom k 3 ( 3 k ) 次
选取集合个数为 4 4 4 时,这个元素被减了 ( k 4 ) \displaystyle\binom k 4 ( 4 k ) 次
……
总的来看,元素 x x x 对答案产生的贡献即为
∑ i = 1 k ( k i ) × ( − 1 ) i + 1 \sum_{i = 1}^k \binom k i\times(-1)^{i + 1} i = 1 ∑ k ( i k ) × ( − 1 ) i + 1
由二项式定理知其结果为 1 1 1 ,所以每个元素都正正好好被统计了一次,命题得证。
回到刚才的唯一分解式
n = ∏ k = 1 ω ( n ) p k a k n=\prod_{k = 1}^{\omega(n)} p_k^{a_k} n = k = 1 ∏ ω ( n ) p k a k
我们将容斥原理换一种方式表达:
( − 1 ) 0 × ⋃ k = 1 ω A i + ∑ k = 1 ω ( ( − 1 ) k × ∑ 1 ≤ j 1 < j 2 < ⋯ < j k ≤ ω ( ⋂ p = 1 k A j p ) ) = ∅ (-1)^0\times \bigcup_{k = 1}^{\omega}A_i + \sum_{k = 1}^\omega\left((-1)^k\times\sum_{1\le j_1< j_2 <\cdots <j_k\le \omega}\left(\bigcap_{p = 1}^kA_{j_p}\right) \right)= \varnothing ( − 1 ) 0 × k = 1 ⋃ ω A i + k = 1 ∑ ω ( ( − 1 ) k × 1 ≤ j 1 < j 2 < ⋯ < j k ≤ ω ∑ ( p = 1 ⋂ k A j p ) ) = ∅
定义
f ( a ) = ∏ k ω p k [ a ∈ A k ] f(a) = \prod_{k}^\omega p_k^{[a\in A_k]} f ( a ) = k ∏ ω p k [ a ∈ A k ]
B n d = { a : d ∣ f ( a ) } B_{\frac nd} = \{a:d\mid f(a)\} B d n = { a : d ∣ f ( a ) }
其中 d ∣ n d\mid n d ∣ n
理解一下上面的式子:A k A_k A k 表示好多好多个集合,其中 A k A_k A k 被染色成了唯一分解式中的 p k p_k p k ,然后 A k 1 ∩ A k 2 A_{k_1}\cap A_{k_2} A k 1 ∩ A k 2 被染成了 p k 1 × p k 2 p_{k_1}\times p{k_2} p k 1 × p k 2 ,依次类推。不难发现 f ( a ) f(a) f ( a ) 即代表了一个元素所在区域的颜色(如下图)
而 B n d B_{\frac nd} B d n 表示的就是图中的一个划分。举个例子:n = p k 1 a k 1 p k 2 a k 2 p k 3 a k 3 n = p_{k_1}^{a_{k_1}}p_{k_2}^{a_{k_2}}p_{k_3}^{a_{k_3}} n = p k 1 a k 1 p k 2 a k 2 p k 3 a k 3 (对应上面的图),当 d = p k 1 p k 2 d = p_{k_1}p_{k_2} d = p k 1 p k 2 时,满足 d ∣ f ( a ) d \mid f(a) d ∣ f ( a ) 的也只有上图绿色的两块区域了,所以 B n d = A k 1 ∩ A k 2 B_{\frac n d} = A_{k_1}\cap A_{k_2} B d n = A k 1 ∩ A k 2
有了上述定义,我们有下面的式子:
∑ d ∣ n ( μ ( d ) × B n d ) = ∅ \sum_{d\mid n}(\mu(d)\times B_{\frac nd}) = \varnothing d ∣ n ∑ ( μ ( d ) × B d n ) = ∅
发现其具有的就是容斥原理的形式。
进一步地,我们定义
g ( n d ) = { a : d = f ( a ) } \begin{aligned}
g\left(\frac n d\right) &= \{a:d = f(a)\}
\end{aligned} g ( d n ) = { a : d = f ( a ) }
所以有
( 1 ∗ g ) ( n d ) = { a : d ∣ f ( a ) } (1*g)\left(\frac nd\right) = \{a:d\mid f(a)\} ( 1 ∗ g ) ( d n ) = { a : d ∣ f ( a ) }
∅ = g = μ ∗ 1 ∗ g = ∑ d ∣ n ( μ ( d ) × ( 1 ∗ g ) ( n d ) ) \varnothing = g = \mu * 1 * g = \sum_{d\mid n}\left(\mu(d)\times(1*g)\left(\frac nd\right)\right) ∅ = g = μ ∗ 1 ∗ g = d ∣ n ∑ ( μ ( d ) × ( 1 ∗ g ) ( d n ) )
联系上述式子尽量理解其含义
最终,莫比乌斯反演的表达式是如下的:
g ( n ) = ∑ d ∣ n f ( d ) ⟺ f ( n ) = ∑ d ∣ n ( μ ( d ) × g ( n d ) ) = ∑ d ∣ n ( g ( d ) × μ ( n d ) ) g = 1 ∗ f ⟺ f = μ ∗ g \begin{aligned}
g(n) = \sum_{d\mid n}f(d) & \iff f(n) = \sum_{d\mid n}\left(\mu(d)\times g\left(\frac nd\right) \right)=\sum_{d\mid n}\left(g(d)\times \mu\left(\frac nd\right) \right)\\
g = 1 * f&\iff f = \mu * g
\end{aligned} g ( n ) = d ∣ n ∑ f ( d ) g = 1 ∗ f ⟺ f ( n ) = d ∣ n ∑ ( μ ( d ) × g ( d n ) ) = d ∣ n ∑ ( g ( d ) × μ ( d n ) ) ⟺ f = μ ∗ g
莫比乌斯反演的本质就是容斥原理
例题:洛谷P3455 [POI2007]ZAP-Queries
题意:求
∑ i = 1 a ∑ j = 1 b [ gcd ( i , j ) = d ] \sum_{i = 1}^a\sum_{j = 1}^b[\gcd(i,j) = d] i = 1 ∑ a j = 1 ∑ b [ g cd( i , j ) = d ]
解:
莫比乌斯反演时,一般要将含 gcd \gcd g cd 的式子化为 gcd ( i , j ) = 1 \gcd(i,j) = 1 g cd( i , j ) = 1 的形式才好反演。因此考虑设 a ′ = a / d a' = a/d a ′ = a / d ,b ′ = b / d b' = b/d b ′ = b / d ,原式化为
∑ i = 1 a ′ ∑ j = 1 b ′ [ gcd ( i , j ) = 1 ] \sum_{i = 1}^{a'}\sum_{j = 1}^{b'}[\gcd(i,j) = 1] i = 1 ∑ a ′ j = 1 ∑ b ′ [ g cd( i , j ) = 1 ]
然后就可以愉快的反演了。我们知道
μ ∗ 1 = ϵ \mu * 1 = \epsilon μ ∗ 1 = ϵ
所以
ϵ ( n ) = ∑ d ∣ n μ ( d ) \epsilon(n) = \sum_{d\mid n}\mu(d) ϵ ( n ) = d ∣ n ∑ μ ( d )
稍微变一下:
ϵ ( gcd ( i , j ) ) = ∑ d ∣ gcd ( i , j ) μ ( d ) \epsilon(\gcd(i,j)) = \sum_{d\mid \gcd(i,j)}\mu(d) ϵ ( g cd( i , j ) ) = d ∣ g c d ( i , j ) ∑ μ ( d )
所以原式化为
∑ i = 1 a ′ ∑ j = 1 b ′ ∑ d ∣ gcd ( i , j ) μ ( d ) \sum_{i = 1}^{a'}\sum_{j = 1}^{b'}\sum_{d\mid \gcd(i,j)}\mu(d) i = 1 ∑ a ′ j = 1 ∑ b ′ d ∣ g c d ( i , j ) ∑ μ ( d )
考虑写成枚举 d d d 的形式:
∑ i = 1 a ′ ∑ j = 1 b ′ ∑ d ∣ gcd ( i , j ) μ ( d ) = ∑ i = 1 a ′ ∑ j = 1 b ′ ∑ d = 1 min ( a ′ , b ′ ) [ d ∣ gcd ( i , j ) ] μ ( d ) = ∑ d = 1 min ( a ′ , b ′ ) μ ( d ) ∑ i = 1 a ′ ∑ j = 1 b ′ [ d ∣ gcd ( i , j ) ] \begin{aligned}
&\sum_{i = 1}^{a'}\sum_{j = 1}^{b'}\sum_{d\mid \gcd(i,j)}\mu(d)\\
=&\sum_{i = 1}^{a'}\sum_{j = 1}^{b'}\sum_{d = 1}^{\min(a',b')}[d\mid\gcd(i,j)]\mu(d)\\
=&\sum_{d=1}^{\min(a',b')}\mu(d)\sum_{i = 1}^{a'}\sum_{j = 1}^{b'}[d\mid\gcd(i,j)]
\end{aligned} = = i = 1 ∑ a ′ j = 1 ∑ b ′ d ∣ g c d ( i , j ) ∑ μ ( d ) i = 1 ∑ a ′ j = 1 ∑ b ′ d = 1 ∑ m i n ( a ′ , b ′ ) [ d ∣ g cd( i , j ) ] μ ( d ) d = 1 ∑ m i n ( a ′ , b ′ ) μ ( d ) i = 1 ∑ a ′ j = 1 ∑ b ′ [ d ∣ g cd( i , j ) ]
考虑到若要使 d ∣ gcd ( i , j ) d\mid \gcd(i,j) d ∣ g cd( i , j ) ,i i i 和 j j j 必须同为 d d d 的倍数,根据乘法原理,原式可以化为
∑ d = 1 min ( a ′ , b ′ ) μ ( d ) ⌊ a ′ d ⌋ ⌊ b ′ d ⌋ \sum_{d=1}^{\min(a',b')}\mu(d)\left\lfloor\frac{a'}{d}\right\rfloor\left\lfloor\frac{b'}{d}\right\rfloor d = 1 ∑ m i n ( a ′ , b ′ ) μ ( d ) ⌊ d a ′ ⌋ ⌊ d b ′ ⌋
预处理出 μ \mu μ 的前缀和,再套一个整除分块即可。
# include <cstdio>
# include <cctype>
# define FOR ( i, a, b) for ( int i = a; i <= b; ++ i)
const int maxn = 5e4 + 7 ;
inline int read ( )
{
char c = getchar ( ) ;
int s = 0 ;
while ( ! isdigit ( c) )
c = getchar ( ) ;
while ( isdigit ( c) )
s = 10 * s + c - '0' , c = getchar ( ) ;
return s;
}
int mu[ maxn] , prime[ maxn] , tot, vis[ maxn] ;
void getmu ( )
{
mu[ 1 ] = 1 ;
for ( int i = 2 ; i <= maxn - 5 ; ++ i)
{
if ( ! vis[ i] )
{
mu[ i] = - 1 ;
prime[ ++ tot] = i;
}
for ( int j = 1 ; j <= tot && i * prime[ j] <= maxn - 5 ; ++ j)
{
vis[ i * prime[ j] ] = 1 ;
if ( i % prime[ j] == 0 )
{
mu[ i * prime[ j] ] = 0 ;
break ;
}
else
mu[ i * prime[ j] ] = - mu[ i] ;
}
}
FOR ( i, 1 , maxn - 5 )
mu[ i] += mu[ i - 1 ] ;
return ;
}
inline int min ( int a, int b) { return a < b ? a : b; }
int main ( )
{
getmu ( ) ;
int T = read ( ) ;
while ( T-- )
{
int a = read ( ) , b = read ( ) , d = read ( ) ;
a /= d, b /= d;
int top = min ( a, b) , ans = 0 ;
for ( int l = 1 , r = 0 ; l <= top && r <= top; l = r + 1 )
{
r = min ( top, min ( a / ( a / l) , b / ( b / l) ) ) ;
ans += ( a / l) * ( b / l) * ( mu[ r] - mu[ l - 1 ] ) ;
}
printf ( "%d\n" , ans) ;
}
return 0 ;
}
洛谷 P2522 [HAOI2011]Problem b 与此题类似,只不过需要套一个容斥。
例题:洛谷 P2257 YY的GCD
题意:求
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) ∈ P ] \sum_{i = 1}^n\sum_{j = 1}^m[\gcd(i,j) \in P] i = 1 ∑ n j = 1 ∑ m [ g cd( i , j ) ∈ P ]
其中 P P P 为质数集。
思路:
不妨枚举这个质数,如下:
∑ k ∈ P ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = k ] \sum_{k\in P}\sum_{i = 1}^n\sum_{j = 1}^m[\gcd(i,j) = k] k ∈ P ∑ i = 1 ∑ n j = 1 ∑ m [ g cd( i , j ) = k ]
然后就是像上题一样化简:
∑ k ∈ P ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = k ] = ∑ k ∈ P ∑ i = 1 n ′ ∑ j = 1 m ′ [ gcd ( i , j ) = 1 ] , n ′ = ⌊ n k ⌋ , m ′ = ⌊ m k ⌋ = ∑ k ∈ P ∑ i = 1 n ′ ∑ j = 1 m ′ ∑ d ∣ gcd ( i , j ) μ ( d ) = ∑ k ∈ P ∑ d = 1 min ( n ′ , m ′ ) μ ( d ) ⌊ n k d ⌋ ⌊ m k d ⌋ \begin{aligned}
&\sum_{k\in P}\sum_{i = 1}^n\sum_{j = 1}^m[\gcd(i,j) = k]\\
=&\sum_{k\in P}\sum_{i = 1}^{n'}\sum_{j = 1}^{m'}[\gcd(i,j) = 1],\quad n' = \left\lfloor\frac nk \right\rfloor,m' = \left\lfloor\frac mk \right\rfloor\\
=&\sum_{k\in P}\sum_{i = 1}^{n'}\sum_{j = 1}^{m'}\sum_{d\mid \gcd(i,j)}\mu(d)\\
=&\sum_{k\in P}\sum_{d = 1}^{\min(n',m')}\mu(d)\left\lfloor\frac{n}{kd}\right\rfloor\left\lfloor\frac{m}{kd}\right\rfloor
\end{aligned} = = = k ∈ P ∑ i = 1 ∑ n j = 1 ∑ m [ g cd( i , j ) = k ] k ∈ P ∑ i = 1 ∑ n ′ j = 1 ∑ m ′ [ g cd( i , j ) = 1 ] , n ′ = ⌊ k n ⌋ , m ′ = ⌊ k m ⌋ k ∈ P ∑ i = 1 ∑ n ′ j = 1 ∑ m ′ d ∣ g c d ( i , j ) ∑ μ ( d ) k ∈ P ∑ d = 1 ∑ m i n ( n ′ , m ′ ) μ ( d ) ⌊ k d n ⌋ ⌊ k d m ⌋
此时这个式子看上去已经差不多了,但是实际运行的时候还是会 T 掉,考虑设 T = k d T = kd T = k d ,有
∑ k ∈ P ∑ d = 1 min ( n ′ , m ′ ) μ ( d ) ⌊ n k d ⌋ ⌊ m k d ⌋ = ∑ k ∈ P ∑ d = 1 min ( n ′ , m ′ ) μ ( T k ) ⌊ n T ⌋ ⌊ m T ⌋ \begin{aligned}
&\sum_{k\in P}\sum_{d = 1}^{\min(n',m')}\mu(d)\left\lfloor\frac{n}{kd}\right\rfloor\left\lfloor\frac{m}{kd}\right\rfloor\\
=&\sum_{k\in P}\sum_{d= 1}^{\min(n',m')}\mu\left(\frac Tk\right)\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor\\
\end{aligned} = k ∈ P ∑ d = 1 ∑ m i n ( n ′ , m ′ ) μ ( d ) ⌊ k d n ⌋ ⌊ k d m ⌋ k ∈ P ∑ d = 1 ∑ m i n ( n ′ , m ′ ) μ ( k T ) ⌊ T n ⌋ ⌊ T m ⌋
换成枚举 T T T ,提前:
∑ k ∈ P ∑ d = 1 min ( n ′ , m ′ ) μ ( T k ) ⌊ n T ⌋ ⌊ m T ⌋ = ∑ T = 1 n ⌊ n T ⌋ ⌊ m T ⌋ ∑ k ∣ T ∧ k ∈ P μ ( T k ) \begin{aligned}
&\sum_{k\in P}\sum_{d= 1}^{\min(n',m')}\mu\left(\frac Tk\right)\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor\\
=&\sum_{T = 1}^n\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor\sum_{k\mid T\land k\in P}\mu\left(\frac Tk\right)
\end{aligned} = k ∈ P ∑ d = 1 ∑ m i n ( n ′ , m ′ ) μ ( k T ) ⌊ T n ⌋ ⌊ T m ⌋ T = 1 ∑ n ⌊ T n ⌋ ⌊ T m ⌋ k ∣ T ∧ k ∈ P ∑ μ ( k T )
∑ k ∣ T ∧ k ∈ P μ ( T k ) \displaystyle\sum_{k\mid T\land k\in P}\mu\left(\frac Tk\right) k ∣ T ∧ k ∈ P ∑ μ ( k T ) 是可以预处理的,预处理然后整除分块就可以了。实际实现的时候记得开 long long
并卡卡常(不要处处 long long
)
# include <cstdio>
# include <cctype>
# define FOR ( i, a, b) for ( register int i = a; i <= b; ++ i)
const int maxn = 1e7 + 7 ;
inline int read ( )
{
char c = getchar ( ) ;
int s = 0 ;
while ( ! isdigit ( c) )
c = getchar ( ) ;
while ( isdigit ( c) )
s = 10 * s + c - '0' , c = getchar ( ) ;
return s;
}
inline int min ( int a, int b) { return a < b ? a : b; }
typedef long long ll;
int mu[ maxn] , p[ maxn] , vis[ maxn] , tot;
ll sum[ maxn] ;
void getmu ( )
{
mu[ 1 ] = 1 ;
FOR ( i, 2 , maxn - 5 )
{
if ( ! vis[ i] )
{
p[ ++ tot] = i;
mu[ i] = - 1 ;
}
for ( int j = 1 ; j <= tot && i * p[ j] <= maxn - 5 ; ++ j)
{
vis[ i * p[ j] ] = 1 ;
if ( i % p[ j] == 0 )
{
mu[ i * p[ j] ] = 0 ;
break ;
}
mu[ i * p[ j] ] = - mu[ i] ;
}
}
FOR ( j, 1 , tot)
for ( int i = 1 ; i * p[ j] <= maxn - 5 ; ++ i)
sum[ i * p[ j] ] += mu[ i] ;
FOR ( i, 1 , maxn - 5 )
sum[ i] += sum[ i - 1 ] ;
return ;
}
signed main ( )
{
getmu ( ) ;
int kase = read ( ) ;
while ( kase-- )
{
int n = read ( ) , m = read ( ) ;
int top = min ( n, m) ;
ll ans = 0 ;
for ( int l = 1 , r = 0 ; l <= top; l = r + 1 )
{
r = min ( top, min ( n / ( n / l) , m / ( m / l) ) ) ;
ans += ( ll) ( n / l) * ( ll) ( m / l) * ( sum[ r] - sum[ l - 1 ] ) ;
}
printf ( "%lld\n" , ans) ;
}
return 0 ;
}
定义:
gcd ( a , b ) = 1 ⟹ f ( a × b ) = f ( a ) × f ( b ) \gcd(a, b) = 1 \implies f(a\times b) = f(a)\times f(b) g cd( a , b ) = 1 ⟹ f ( a × b ) = f ( a ) × f ( b )
由定义知 f ( 1 ) = 1 f(1) = 1 f ( 1 ) = 1
一些魔术:
gcd ( a , b ) = 1 ⟹ ∑ d ∣ a b f ( d ) = ∑ d 1 ∣ a ∧ d 2 ∣ b ( f ( d 1 ) × f ( d 2 ) ) = ( ∑ d 1 ∣ a f ( d 1 ) ) × ( ∑ d 2 ∣ b f ( d 2 ) ) \gcd(a,b) = 1\implies\sum_{d\mid ab}f(d) = \sum_{d_1 \mid a \land d_2\mid b}(f(d_1)\times f(d_2)) = \left(\sum_{d_1\mid a}f(d_1)\right)\times\left(\sum_{d_2\mid b}f(d_2)\right) g cd( a , b ) = 1 ⟹ d ∣ a b ∑ f ( d ) = d 1 ∣ a ∧ d 2 ∣ b ∑ ( f ( d 1 ) × f ( d 2 ) ) = ⎝ ⎛ d 1 ∣ a ∑ f ( d 1 ) ⎠ ⎞ × ⎝ ⎛ d 2 ∣ b ∑ f ( d 2 ) ⎠ ⎞
上面的式子应该比较好理解,利用这个性质我们可以将一个 n n n 拆分开来求和再乘在一起。通过上式可以推出下式:
gcd ( a , b ) = 1 ⟹ ( f ∗ g ) ( a b ) = ∑ d ∣ a b ( f ( d ) × g ( a b d ) ) = ∑ d 1 ∣ a ∧ d 2 ∣ b ( f ( d 1 ) g ( a d 1 ) f ( d 2 ) g ( b d 2 ) ) = ∑ d 1 ∣ a ( f ( d 1 ) g ( a d 1 ) ) × ∑ d 2 ∣ b ( f ( d 2 ) g ( b d 2 ) ) = ( f ∗ g ) ( a ) × ( f ∗ g ) ( b ) \begin{aligned}
\gcd(a,b) = 1\implies (f*g)(ab) &= \sum_{d\mid ab}\left(f(d)\times g\left(\frac{ab}{d}\right)\right)\\
&=\sum_{d_1\mid a\land d_2\mid b}\left(f(d_1)g\left(\frac{a}{d_1}\right)f(d_2)g\left(\frac{b}{d_2}\right) \right)\\
&=\sum_{d_1\mid a}\left(f(d_1)g\left(\frac{a}{d_1}\right)\right)\times\sum_{d_2\mid b}\left(f(d_2)g\left(\frac{b}{d_2}\right) \right)\\
&= (f*g)(a)\times(f*g)(b)
\end{aligned} g cd( a , b ) = 1 ⟹ ( f ∗ g ) ( a b ) = d ∣ a b ∑ ( f ( d ) × g ( d a b ) ) = d 1 ∣ a ∧ d 2 ∣ b ∑ ( f ( d 1 ) g ( d 1 a ) f ( d 2 ) g ( d 2 b ) ) = d 1 ∣ a ∑ ( f ( d 1 ) g ( d 1 a ) ) × d 2 ∣ b ∑ ( f ( d 2 ) g ( d 2 b ) ) = ( f ∗ g ) ( a ) × ( f ∗ g ) ( b )
其中 f , g f,g f , g 为积性函数。
完全积性函数:
∀ a , b ∈ N ∗ , f ( a × b ) = f ( a ) × f ( b ) \forall a,b\in\mathbb N^*,\:f(a\times b) = f(a)\times f(b) ∀ a , b ∈ N ∗ , f ( a × b ) = f ( a ) × f ( b )
例子:1 ( n ) = 1 1(n) = 1 1 ( n ) = 1 ,i d k ( n ) = n k \mathrm{id}^k(n) = n^k i d k ( n ) = n k ,i d ( n ) = n \mathrm{id}(n) = n i d ( n ) = n
不难发现其具有如下性质
f ( p n ) = ( f ( p ) ) n f(p^n) = \left(f(p)\right)^n f ( p n ) = ( f ( p ) ) n
显然。
( f × g ) ∗ ( f × h ) = ∑ d ∣ n ( f ( d ) × g ( d ) × f ( n d ) × h ( n d ) ) = f × ∑ d ∣ n ( g ( d ) × h ( n d ) ) = f × ( g ∗ h ) \begin{aligned}
(f\times g)*(f\times h) &= \sum_{d\mid n}\left(f(d)\times g(d)\times f\left(\frac n d \right)\times h\left(\frac nd \right) \right)\\
&=f\times\sum_{d\mid n}\left(g(d)\times h\left(\frac nd \right) \right)\\
&=f\times(g*h)
\end{aligned} ( f × g ) ∗ ( f × h ) = d ∣ n ∑ ( f ( d ) × g ( d ) × f ( d n ) × h ( d n ) ) = f × d ∣ n ∑ ( g ( d ) × h ( d n ) ) = f × ( g ∗ h )
除数函数:
τ ( n ) = ∑ d ∣ n 1 σ ( n ) = ∑ d ∣ n d \begin{aligned}
\tau(n) &= \sum_{d\mid n}1\\
\sigma(n) &= \sum_{d\mid n}d
\end{aligned} τ ( n ) σ ( n ) = d ∣ n ∑ 1 = d ∣ n ∑ d
前面的 τ ( n ) \tau(n) τ ( n ) 描述了 n n n 的约数个数,σ ( n ) \sigma(n) σ ( n ) 则描述的是 n n n 的约数和。
一般的,
σ m ( n ) = ∑ d ∣ n d m = 1 ∗ n m \sigma_m(n) = \sum_{d\mid n}d^m = 1 * n^m σ m ( n ) = d ∣ n ∑ d m = 1 ∗ n m
不难发现,τ ( n ) = σ 0 ( n ) \tau(n) = \sigma_0(n) τ ( n ) = σ 0 ( n ) ,σ ( n ) = σ 1 ( n ) \sigma(n) = \sigma_1(n) σ ( n ) = σ 1 ( n ) ,且 σ m ( n ) \sigma_m(n) σ m ( n ) 为积性函数,验证如下:
假定 gcd ( a , b ) = 1 \gcd(a,b) = 1 g cd( a , b ) = 1
σ m ( a ) × σ m ( b ) = ( 1 ∗ a m ) × ( 1 ∗ b m ) = ∑ d 1 ∣ a d 1 m × ∑ d 2 ∣ b d 2 m = ∑ d 1 ∣ a ∧ d 2 ∣ b ( d 1 d 2 ) m = σ m ( a b ) \begin{aligned}
\sigma_m(a)\times \sigma_m(b) &= (1*a^m)\times(1*b^m)\\
&=\sum_{d_1\mid a}d_1^m\times \sum_{d_2\mid b}d_2^m\\
&=\sum_{d_1\mid a\land d_2\mid b}(d_1d_2)^m\\
&=\sigma_m(ab)
\end{aligned} σ m ( a ) × σ m ( b ) = ( 1 ∗ a m ) × ( 1 ∗ b m ) = d 1 ∣ a ∑ d 1 m × d 2 ∣ b ∑ d 2 m = d 1 ∣ a ∧ d 2 ∣ b ∑ ( d 1 d 2 ) m = σ m ( a b )
欧拉函数:
ϕ ( n ) = ∑ 1 ≤ k ≤ n gcd ( k , n ) = 1 1 \phi(n) = \sum_{\substack{1\le k\le n\\\gcd(k, n) = 1}}1 ϕ ( n ) = 1 ≤ k ≤ n g c d ( k , n ) = 1 ∑ 1
更一般地:
ϕ m ( n ) = ∑ 1 ≤ k j ≤ n gcd ( k 1 , k 2 , ⋯ , k m , n ) = 1 1 = μ ∗ i d m \phi_m(n) = \sum_{\substack{1\le k_j\le n\\ \gcd(k_1,k_2,\cdots,k_m,n) = 1}}1 = \mu *\mathrm{id}^m ϕ m ( n ) = 1 ≤ k j ≤ n g c d ( k 1 , k 2 , ⋯ , k m , n ) = 1 ∑ 1 = μ ∗ i d m
其意义为从 1 , 2 , ⋯ , n 1,2,\cdots,n 1 , 2 , ⋯ , n 中选出 m m m 个不相同且两两互质的数的方案数。
下面证明 ϕ m = μ ∗ i d m \phi_m = \mu * \mathrm{id}^m ϕ m = μ ∗ i d m
令 f ( i ) f(i) f ( i ) 为任意完全积性函数
∑ 1 ≤ k j ≤ n gcd ( k 1 , k 2 , ⋯ , k m , n ) = 1 ( f 1 ( k 1 ) f 2 ( k 2 ) ⋯ f m ( k m ) ) = ∑ 1 ≤ k j ≤ n ( [ gcd ( k 1 , k 2 , ⋯ , k m , n ) = 1 ] ∏ 1 ≤ j ≤ m f j ( k j ) ) = ∑ 1 ≤ k j ≤ n d ∣ gcd ( k 1 , k 2 ⋯ , k m , n ) ( μ ( d ) ∏ 1 ≤ j ≤ m f j ( k j ) ) = ∑ 1 ≤ k j ≤ n d ∣ gcd ( k 1 , k 2 ⋯ , k m , n ) ( μ ( d ) ∏ 1 ≤ j ≤ m k j ′ d = k j f j ( k j ′ d ) ) = ∑ 1 ≤ k j ≤ n d ∣ gcd ( k 1 , k 2 ⋯ , k m , n ) ( μ ( d ) ∏ 1 ≤ j ≤ m k j ′ d = k j f j ( d ) ∏ 1 ≤ j ≤ m k j ′ d = k j f j ( k j ′ ) ) \begin{aligned}
\sum_{\substack{1\le k_j\le n\\ \gcd(k_1,k_2,\cdots,k_m,n) = 1}}(f_1(k_1)f_2(k_2)\cdots f_m(k_m))&=\sum_{1\le k_j\le n}\left([\gcd(k_1, k_2, \cdots, k_m, n) = 1]\prod_{1\le j\le m}f_j(k_j) \right)\\
&=\sum_{\substack{1\le k_j\le n\\d\mid \gcd(k_1,k_2\cdots,k_m, n)}}\left(\mu(d)\prod_{1\le j\le m}f_j(k_j) \right)\\
&=\sum_{\substack{1\le k_j\le n\\d\mid \gcd(k_1,k_2\cdots,k_m, n)}}\left(\mu(d)\prod_{\substack{1\le j\le m\\k_j'd = k_j}}f_j(k_j'd) \right)\\
&=\sum_{\substack{1\le k_j\le n\\d\mid \gcd(k_1,k_2\cdots,k_m, n)}}\left(\mu(d)\prod_{\substack{1\le j\le m\\k_j'd = k_j}}f_j(d)\prod_{\substack{1\le j\le m\\k_j'd = k_j}}f_j(k_j') \right)\\
\end{aligned} 1 ≤ k j ≤ n g c d ( k 1 , k 2 , ⋯ , k m , n ) = 1 ∑ ( f 1 ( k 1 ) f 2 ( k 2 ) ⋯ f m ( k m ) ) = 1 ≤ k j ≤ n ∑ ( [ g cd( k 1 , k 2 , ⋯ , k m , n ) = 1 ] 1 ≤ j ≤ m ∏ f j ( k j ) ) = 1 ≤ k j ≤ n d ∣ g c d ( k 1 , k 2 ⋯ , k m , n ) ∑ ( μ ( d ) 1 ≤ j ≤ m ∏ f j ( k j ) ) = 1 ≤ k j ≤ n d ∣ g c d ( k 1 , k 2 ⋯ , k m , n ) ∑ ⎝ ⎜ ⎜ ⎜ ⎛ μ ( d ) 1 ≤ j ≤ m k j ′ d = k j ∏ f j ( k j ′ d ) ⎠ ⎟ ⎟ ⎟ ⎞ = 1 ≤ k j ≤ n d ∣ g c d ( k 1 , k 2 ⋯ , k m , n ) ∑ ⎝ ⎜ ⎜ ⎜ ⎛ μ ( d ) 1 ≤ j ≤ m k j ′ d = k j ∏ f j ( d ) 1 ≤ j ≤ m k j ′ d = k j ∏ f j ( k j ′ ) ⎠ ⎟ ⎟ ⎟ ⎞
定义 s j ( i ) = ∑ k = 1 i f j ( k ) s_j(i) = \displaystyle\sum_{k = 1}^if_j(k) s j ( i ) = k = 1 ∑ i f j ( k ) ,继续化简:
∑ 1 ≤ k j ≤ n gcd ( k 1 , k 2 , ⋯ , k m , n ) = 1 ( f 1 ( k 1 ) f 2 ( k 2 ) ⋯ f m ( k m ) ) = ∑ 1 ≤ k j ≤ n d ∣ gcd ( k 1 , k 2 ⋯ , k m , n ) ( μ ( d ) ∏ 1 ≤ j ≤ m k j ′ d = k j f j ( d ) ∏ 1 ≤ j ≤ m k j ′ d = k j f j ( k j ′ ) ) = ∑ d ∣ n ( μ ( d ) ∏ 1 ≤ j ≤ m f j ( d ) ∏ 1 ≤ j ≤ m s j ( n d ) ) = ( μ ( n ) × ∏ 1 ≤ j ≤ m f j ( n ) ) ∗ ∏ 1 ≤ j ≤ m s j ( n ) \begin{aligned}
\sum_{\substack{1\le k_j\le n\\ \gcd(k_1,k_2,\cdots,k_m,n) = 1}}(f_1(k_1)f_2(k_2)\cdots f_m(k_m))&=\sum_{\substack{1\le k_j\le n\\d\mid \gcd(k_1,k_2\cdots,k_m, n)}}\left(\mu(d)\prod_{\substack{1\le j\le m\\k_j'd = k_j}}f_j(d)\prod_{\substack{1\le j\le m\\k_j'd = k_j}}f_j(k_j') \right)\\
&=\sum_{d\mid n}\left(\mu(d)\prod_{1\le j\le m}f_j(d)\prod_{1\le j\le m}s_j\left(\frac nd\right)\right)\\
&=\left(\mu(n)\times\prod_{1\le j\le m}f_j(n)\right) * \prod_{1\le j\le m}s_j(n)
\end{aligned} 1 ≤ k j ≤ n g c d ( k 1 , k 2 , ⋯ , k m , n ) = 1 ∑ ( f 1 ( k 1 ) f 2 ( k 2 ) ⋯ f m ( k m ) ) = 1 ≤ k j ≤ n d ∣ g c d ( k 1 , k 2 ⋯ , k m , n ) ∑ ⎝ ⎜ ⎜ ⎜ ⎛ μ ( d ) 1 ≤ j ≤ m k j ′ d = k j ∏ f j ( d ) 1 ≤ j ≤ m k j ′ d = k j ∏ f j ( k j ′ ) ⎠ ⎟ ⎟ ⎟ ⎞ = d ∣ n ∑ ( μ ( d ) 1 ≤ j ≤ m ∏ f j ( d ) 1 ≤ j ≤ m ∏ s j ( d n ) ) = ( μ ( n ) × 1 ≤ j ≤ m ∏ f j ( n ) ) ∗ 1 ≤ j ≤ m ∏ s j ( n )
若此时限定 f j ( n ) = 1 f_j(n) = 1 f j ( n ) = 1 ,则此时 ∏ 1 ≤ j ≤ m s j ( n ) = n m \displaystyle \prod_{1\le j\le m}s_j(n) = n^m 1 ≤ j ≤ m ∏ s j ( n ) = n m
∑ 1 ≤ k j ≤ n gcd ( k 1 , k 2 , ⋯ , k m , n ) = 1 ( f 1 ( k 1 ) f 2 ( k 2 ) ⋯ f m ( k m ) ) = ∑ 1 ≤ k j ≤ n gcd ( k 1 , k 2 , ⋯ , k m , n ) = 1 1 = ( μ ( n ) × ∏ 1 ≤ j ≤ m f j ( n ) ) ∗ ∏ 1 ≤ j ≤ m s j ( n ) = μ ∗ i d m \begin{aligned}
\sum_{\substack{1\le k_j\le n\\ \gcd(k_1,k_2,\cdots,k_m,n) = 1}}(f_1(k_1)f_2(k_2)\cdots f_m(k_m))&=\sum_{\substack{1\le k_j\le n\\ \gcd(k_1,k_2,\cdots,k_m,n) = 1}}1\\
&=\left(\mu(n)\times\prod_{1\le j\le m}f_j(n)\right) * \prod_{1\le j\le m}s_j(n)\\
&=\mu*\mathrm{id}^m
\end{aligned} 1 ≤ k j ≤ n g c d ( k 1 , k 2 , ⋯ , k m , n ) = 1 ∑ ( f 1 ( k 1 ) f 2 ( k 2 ) ⋯ f m ( k m ) ) = 1 ≤ k j ≤ n g c d ( k 1 , k 2 , ⋯ , k m , n ) = 1 ∑ 1 = ( μ ( n ) × 1 ≤ j ≤ m ∏ f j ( n ) ) ∗ 1 ≤ j ≤ m ∏ s j ( n ) = μ ∗ i d m
例:给定 a j ( 1 ≤ j ≤ m ) a_j\:(1\le j\le m) a j ( 1 ≤ j ≤ m )
ParseError: KaTeX parse error: Undefined control sequence: \
at position 258: …(k_j = k_j'd)\\\̲
̲=&\sum_{{1\le k…
杜教筛可以求解积性函数的前缀和。
设现在要求积性函数 f f f 的前缀和,设 S ( n ) = ∑ i = 1 n f ( i ) S(n) = \displaystyle\sum_{i=1}^nf(i) S ( n ) = i = 1 ∑ n f ( i )
再随便找一个积性函数 g g g ,考虑他们的狄利克雷卷积的前缀和
∑ i = 1 n ( f ∗ g ) ( i ) = ∑ i = 1 n ∑ d ∣ i f ( i ) g ( i d ) = ∑ i = 1 n ∑ j = 1 ⌊ n i ⌋ g ( i ) f ( j ) = ∑ i = 1 n ( g ( i ) ∑ i = 1 ⌊ n i ⌋ f ( j ) ) = ∑ i = 1 n g ( i ) S ( ⌊ n i ⌋ ) \begin{aligned}
&\sum_{i =1}^n(f*g)(i)\\
=&\sum_{i=1}^n\sum_{d\mid i}f(i)g\left(\frac id\right)\\
=&\sum_{i = 1}^n\sum_{j = 1}^{\left\lfloor\frac ni\right\rfloor}g(i)f(j) \\
=&\sum_{i = 1}^n\left(g(i)\sum_{i =1}^{\left\lfloor\frac ni\right\rfloor}f(j)\right)\\
=&\sum_{i=1}^ng(i)S\left(\left\lfloor\frac ni\right\rfloor\right)
\end{aligned} = = = = i = 1 ∑ n ( f ∗ g ) ( i ) i = 1 ∑ n d ∣ i ∑ f ( i ) g ( d i ) i = 1 ∑ n j = 1 ∑ ⌊ i n ⌋ g ( i ) f ( j ) i = 1 ∑ n ⎝ ⎜ ⎜ ⎛ g ( i ) i = 1 ∑ ⌊ i n ⌋ f ( j ) ⎠ ⎟ ⎟ ⎞ i = 1 ∑ n g ( i ) S ( ⌊ i n ⌋ )
现在我们需要求 S ( n ) S(n) S ( n ) ,所以把它提出来,移项:
g ( 1 ) S ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ i = 2 n g ( i ) S ( ⌊ n i ⌋ ) g(1)S(n) = \sum_{i = 1}^n(f*g)(i) – \sum_{i=2}^ng(i)S\left(\left\lfloor\frac ni\right\rfloor\right) g ( 1 ) S ( n ) = i = 1 ∑ n ( f ∗ g ) ( i ) − i = 2 ∑ n g ( i ) S ( ⌊ i n ⌋ )
假如我们可以快速求解 ∑ i = 1 n ( f ∗ g ) ( i ) \displaystyle\sum_{i = 1}^n(f*g)(i) i = 1 ∑ n ( f ∗ g ) ( i ) 并使用数论分块,就可以较快地求得 g ( 1 ) S ( n ) g(1)S(n) g ( 1 ) S ( n )
伪代码:
int getsumf ( int n)
{
int ans = fgs ( n) ;
for ( int l = 2 , r; l <= n; l = r + 1 )
{
r = n / ( n / l) ;
ans -= ( g_sum[ r] - g_sum[ l - 1 ] ) * getsumf ( n / l) ;
}
return ans;
}
可见其是一个递归调用的过程。其复杂度为 O ( n 3 4 ) O(n^{\frac 34}) O ( n 4 3 ) ,证明如下:
设求出 S ( n ) S(n) S ( n ) 的时间复杂度为 T ( n ) T(n) T ( n ) ,要求出 S ( n ) S(n) S ( n ) 需要求出 n \sqrt{n} n 个 S ( ⌊ n i ⌋ ) \displaystyle S\left(\left\lfloor\frac ni\right\rfloor\right) S ( ⌊ i n ⌋ ) 的值,故
T ( n ) = ∑ i = 1 n O ( i ) + O ( n i ) = O ( n 3 4 ) T(n) = \sum_{i = 1}^{\sqrt n}O(\sqrt i) + O\left(\sqrt\frac ni\right) = O\left(n^{\frac34}\right) T ( n ) = i = 1 ∑ n O ( i ) + O ( i n ) = O ( n 4 3 )
进一步地,我们可以先筛出前 m m m 个答案,再使用杜教筛,优化后的复杂度为
T ( n ) = ∑ i = 1 ⌊ n m ⌋ n i = O ( n m ) T(n) = \sum_{i = 1}^{\left\lfloor\frac nm\right\rfloor}\sqrt\frac ni = O\left(\frac{n}{\sqrt m}\right) T ( n ) = i = 1 ∑ ⌊ m n ⌋ i n = O ( m n )
当 m = n 2 3 m = n^\frac23 m = n 3 2 时,T ( n ) = n 2 3 T(n) = n^\frac23 T ( n ) = n 3 2 。
例题:洛谷 P4213 【模板】杜教筛(Sum)
题意:求
ParseError: KaTeX parse error: \cr valid only within a tabular/array environment
由狄利克雷卷积我们知道 μ ∗ 1 = ϵ \mu*1 = \epsilon μ ∗ 1 = ϵ ,故 ϵ ( n ) = ∑ d ∣ n μ ( d ) \epsilon(n) = \displaystyle\sum_{d\mid n}\mu(d) ϵ ( n ) = d ∣ n ∑ μ ( d )
所以
S 1 ( n ) 1 ( 1 ) = ∑ i = 1 n ϵ ( i ) − ∑ i = 2 n S 1 ( ⌊ n i ⌋ ) S 1 ( n ) = 1 − ∑ i = 2 n S 1 ( ⌊ n i ⌋ ) \begin{aligned}
S_1(n)1(1) &= \sum_{i=1}^n\epsilon(i) – \sum_{i=2}^nS_1\left(\left\lfloor\frac ni\right\rfloor\right)\\
S_1(n)&=1-\sum_{i=2}^nS_1\left(\left\lfloor\frac ni\right\rfloor\right)
\end{aligned} S 1 ( n ) 1 ( 1 ) S 1 ( n ) = i = 1 ∑ n ϵ ( i ) − i = 2 ∑ n S 1 ( ⌊ i n ⌋ ) = 1 − i = 2 ∑ n S 1 ( ⌊ i n ⌋ )
由之前,我们也知道 ϕ ∗ 1 = i d \phi * 1 = \mathrm {id} ϕ ∗ 1 = i d
所以
S 2 ( n ) 1 ( 1 ) = ∑ i = 1 n i d ( i ) − ∑ i = 2 n 1 ( i ) S 2 ( ⌊ n i ⌋ ) S 2 ( n ) = ( n + 1 ) n 2 − ∑ i = 2 n S 2 ( ⌊ n i ⌋ ) \begin{aligned}
S_2(n)1(1) &= \sum_{i=1}^n\mathrm{id}(i) – \sum_{i=2}^n1(i)S_2\left(\left\lfloor\frac ni\right\rfloor\right)\\
S_2(n)&=\frac{(n + 1)n}{2} – \sum_{i=2}^nS_2\left(\left\lfloor\frac ni\right\rfloor\right)
\end{aligned} S 2 ( n ) 1 ( 1 ) S 2 ( n ) = i = 1 ∑ n i d ( i ) − i = 2 ∑ n 1 ( i ) S 2 ( ⌊ i n ⌋ ) = 2 ( n + 1 ) n − i = 2 ∑ n S 2 ( ⌊ i n ⌋ )
# include <cstdio>
# include <cctype>
# include <unordered_map>
# define FOR ( i, a, b) for ( int i = a; i <= b; ++ i)
inline int read ( )
{
char c = getchar ( ) ;
int s = 0 ;
bool x = 0 ;
while ( ! isdigit ( c) )
x = x | ( c == '-' ) , c = getchar ( ) ;
while ( isdigit ( c) )
s = 10 * s + c - '0' , c = getchar ( ) ;
return x? - s: s;
}
typedef unsigned long long ll;
const int maxn = 1e7 + 15 ;
std:: unordered_map< int , ll> Mu, Phi;
ll mu[ maxn] , phi[ maxn] ;
int vis[ maxn] , p[ maxn] , tot;
void init ( )
{
mu[ 1 ] = 1 , phi[ 1 ] = 1 ;
FOR ( i, 2 , maxn - 5 )
{
if ( ! vis[ i] )
p[ ++ tot] = i, mu[ i] = - 1 , phi[ i] = i - 1 ;
for ( int j = 1 ; j <= tot && i * p[ j] <= maxn - 5 ; ++ j)
{
vis[ i * p[ j] ] = 1 ;
if ( i % p[ j] == 0 )
{
phi[ i * p[ j] ] = phi[ i] * p[ j] ;
break ;
}
mu[ i * p[ j] ] = - mu[ i] ;
phi[ i * p[ j] ] = phi[ i] * ( p[ j] - 1 ) ;
}
}
FOR ( i, 2 , maxn - 5 )
phi[ i] += phi[ i - 1 ] , mu[ i] += mu[ i - 1 ] ;
return ;
}
ll getSumPhi ( ll n)
{
if ( n <= maxn)
return phi[ n] ;
if ( Phi[ n] )
return Phi[ n] ;
ll ans = ( ll) ( n + 1ll ) * ( ll) n / 2ll ;
for ( ll l = 2 , r; l <= n; l = r + 1 )
{
r = n / ( n / l) ;
ans -= ( r - l + 1LL ) * getSumPhi ( n / l) ;
}
return Phi[ n] = ans;
}
ll getSumMu ( ll n)
{
if ( n <= maxn)
return mu[ n] ;
if ( Mu[ n] )
return Mu[ n] ;
ll ans = 1 ;
for ( ll l = 2 , r; l <= n; l = r + 1 )
{
r = n / ( n / l) ;
ans -= ( r - l + 1LL ) * getSumMu ( n / l) ;
}
return Mu[ n] = ans;
}
int main ( )
{
init ( ) ;
int T = read ( ) ;
while ( T-- )
{
int n = read ( ) ;
printf ( "%lld %lld\n" , getSumPhi ( n) , getSumMu ( n) ) ;
}
return 0 ;
}
留言