关于一类积性函数求和的优化——杜教筛

前置技能点

这是一些前置技能点,扫一眼目录,如果你都会就跳过吧。

有关积性函数的一些定义

  1. 如果一个函数 f ( x ) f(x) f(x) 的定义域为正整数域 Z + \mathbb{Z}^+ Z+,值域为复数域 C \mathbb{C} C(即 f : Z + → C f:\mathbb{Z}^+ \rightarrow \mathbb{C} f:Z+C),那么称 f ( x ) f(x) f(x)数论函数
  2. f ( x ) f(x) f(x)数论函数,并具有以下性质: f ( 1 ) = 1 f(1)=1 f(1)=1,且 ∀ ( p , q ) = 1 \forall (p,q)=1 (p,q)=1,有 f ( p ⋅ q ) = f ( p ) ⋅ f ( q ) f(p\cdot q)=f(p)\cdot f(q) f(pq)=f(p)f(q)。那么我们称 f ( x ) f(x) f(x)积性函数
  3. f ( x ) f(x) f(x)积性函数,且 ∀ p , q \forall p,q p,q,有 f ( p ⋅ q ) = f ( p ) ⋅ f ( q ) f(p\cdot q)=f(p)\cdot f(q) f(pq)=f(p)f(q)。我们称 f ( x ) f(x) f(x) 为完全积性函数。

常见的一些积性函数

1. 除数函数以及其两个特例
除数函数 σ k ( n ) = ∑ d ∣ n d k \sigma_k(n)=\sum_{d|n}{d^k} σk(n)=dndk,表示 n n n 的约数的 k k k 次幂的和。
约数个数函数 τ ( n ) = σ 0 ( n ) = ∑ d ∣ n 1 \tau(n)=\sigma_0(n)=\sum_{d|n}{1} τ(n)=σ0(n)=dn1,表示一个数的约数个数。
约数和函数 σ ( n ) = σ 1 ( n ) = ∑ d ∣ n d \sigma(n)=\sigma_1(n)=\sum_{d|n}{d} σ(n)=σ1(n)=dnd,表示一个数的所有约数之和。
2. 欧拉函数
φ ( n ) = ∑ i = 1 n [ ( n , i ) = 1 ] \varphi(n)=\sum_{i=1}^{n}{\left[\left(n,i\right)=1\right]} φ(n)=i=1n[(n,i)=1] 表示不大于 n n n 且与 n n n 互质的正整数个数 。 1
性质1: ∑ n ∣ d φ ( d ) = n \sum_{n|d}{\varphi(d)}=n ndφ(d)=n2
性质2: ∑ i = 1 n [ ( n , i ) = 1 ] ⋅ i = n ⋅ φ ( n ) + [ n = 1 ] 2 \sum_{i=1}^{n}{[(n,i)=1]\cdot i}=\frac{n\cdot\varphi(n)+[n=1]}{2} i=1n[(n,i)=1]i=2nφ(n)+[n=1]
性质3: ∀ n ∈ N + \forall n\in \mathbb{N}^+ nN+,若 n > 2 n>2 n>2,则有 2 ∣ φ ( n ) 2|\varphi(n) 2φ(n)
3. 莫比乌斯函数
μ ( n ) = { 1 , i f   n = 1 ( − 1 ) k , i f   n = p 1 p 2 ⋯ p k ( p i   i s   a   p r i m e ) 0 , o t h e r w i s e . \mu(n)=\begin{cases} 1, & \mathrm{if\ }n=1 \\ (-1)^k, & \mathrm{if\ }n=p_1 p_2\cdots p_k(p_i\mathrm{\ is\ a\ prime})\\0, & \mathrm{otherwise.} \end{cases} μ(n)=1,(1)k,0,if n=1if n=p1p2pk(pi is a prime)otherwise.
性质1:莫比乌斯函数在狄利克雷卷积的乘法中与下文的恒等函数互为逆元。
性质2: [ n = 1 ] = ∑ d ∣ n μ ( d ) [n=1]=\sum_{d|n}{\mu(d)} [n=1]=dnμ(d) 3
4.其它的常见积性函数
元函数 e ( n ) = [ n = 1 ] e(n)=[n=1] e(n)=[n=1],狄利克雷卷积的乘法单位元,完全积性。
恒等函数 I ( n ) = 1 I(n)=1 I(n)=1,完全积性。
单位函数 i d ( n ) = n id(n)=n id(n)=n ,完全积性。
幂函数 i d k ( n ) = n k id^k(n)=n^k idk(n)=nk,完全积性。
5.一个常用性质
若一个函数 f ( n ) f(n) f(n) 为积性函数,则对于一个正整数 n = ∏ i = 1 t p i k i n=\prod_{i=1}^{t}{p_i^{k_i}} n=i=1tpiki,有 f ( n ) = ∏ i = 1 t f ( p i k i ) f(n)=\prod_{i=1}^{t}{f(p_i^{k_i})} f(n)=i=1tf(piki)
若一个函数 f ( n ) f(n) f(n) 为完全积性函数,则对于一个正整数 n = ∏ i = 1 t p i k i n=\prod_{i=1}^{t}{p_i^{k_i}} n=i=1tpiki,有 f ( n ) = ∏ i = 1 t f k i ( p i ) f(n)=\prod_{i=1}^{t}{f^{k_i}(p_i)} f(n)=i=1tfki(pi)

狄利克雷卷积

  1. 两个数论函数 f f f g g g 的狄利克雷卷积定义为 ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) ⋅ g ( n d ) (f*g)(n)=\sum_{d|n}{f(d)\cdot g(\frac{n}{d})} (fg)(n)=dnf(d)g(dn)。狄利克雷卷积满足交换律、结合律,对加法满足分配律,存在单位元函数 e ( n ) = [ n = 1 ] e(n)=[n=1] e(n)=[n=1] 使得 f ∗ e = f = e ∗ f f*e=f=e*f fe=f=ef,若 f f f g g g 为积性函数则 f ∗ g f*g fg 也为积性函数。
  2. 常见的考虑利用狄利克雷卷积的方法是对于单位元函数或者恒等函数的处理。举个例子,若是有 n = ∏ i = 1 t p i k i , g ( n ) = ∑ d ∣ n f ( d ) n=\prod_{i=1}^{t}{p_i^{k_i}},g(n)=\sum_{d|n}{f(d)} n=i=1tpiki,g(n)=dnf(d),则 g ( n ) = ∏ i = 1 t ∑ j = 0 k i f ( p i j ) g(n)=\prod_{i=1}^{t}\sum_{j=0}^{k_i}{f(p_i^j)} g(n)=i=1tj=0kif(pij)

正文

先举几个例子吧。

例1:欧拉函数的前缀和

求前 n n n 个正整数的欧拉函数之和,即 ϕ ( n ) = ∑ i = 1 n φ ( i ) \phi(n)=\sum_{i=1}^{n}{\varphi(i)} ϕ(n)=i=1nφ(i)
前文告诉我们了一个公式,是 ∑ d ∣ n φ ( d ) = n \sum_{d|n}{\varphi(d)}=n dnφ(d)=n,我们利用这个式子进行化简:
ϕ ( n ) = ∑ i = 1 n φ ( i ) = ∑ i = 1 n i − ∑ d ∣ i , d &lt; i φ ( d ) = n ⋅ ( n + 1 ) 2 − ∑ i = 2 n ∑ d ∣ i , d &lt; i φ ( d ) = n ⋅ ( n + 1 ) 2 − ∑ i d = 2 n ∑ d = 1 ⌊ n i d ⌋ φ ( d ) = n ⋅ ( n + 1 ) 2 − ∑ i = 2 n ∑ d = 1 ⌊ n i ⌋ φ ( d ) = n ⋅ ( n + 1 ) 2 − ∑ i = 2 n ϕ ( ⌊ n i ⌋ ) \phi(n)=\sum_{i=1}^{n}{\varphi(i)}=\sum_{i=1}^{n}{i-\sum_{d|i,d&lt;i}{\varphi(d)}}\\ =\frac{n\cdot(n+1)}{2}-\sum_{i=2}^{n}\sum_{d|i,d&lt;i}{\varphi(d)}\\ =\frac{n\cdot(n+1)}{2}-\sum_{\frac{i}{d}=2}^{n}\sum_{d=1}^{\left\lfloor\frac{n}{\frac{i}{d}}\right\rfloor}{\varphi(d)}\\ =\frac{n\cdot(n+1)}{2}-\sum_{i=2}^{n}\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}{\varphi(d)}\\ =\frac{n\cdot(n+1)}{2}-\sum_{i=2}^{n}{\phi(\lfloor\frac{n}{i}\rfloor)} ϕ(n)=i=1nφ(i)=i=1nidi,d<iφ(d)=2n(n+1)i=2ndi,d<iφ(d)=2n(n+1)di=2nd=1dinφ(d)=2n(n+1)i=2nd=1inφ(d)=2n(n+1)i=2nϕ(in)
那么只要计算出 O ( n ) O(\sqrt{n}) O(n ) ϕ ( ⌊ n i ⌋ ) \phi(\lfloor\frac{n}{i}\rfloor) ϕ(in) 的值就可以计算出 ϕ ( n ) \phi(n) ϕ(n) 的值了。接下来让我们研究一下这样计算的时间复杂度。
我们假设计算一个 ϕ ( n ) \phi(n) ϕ(n) 的时间复杂度为 T ( n ) T(n) T(n),那么 T ( n ) = O ( n ) + ∑ i = 1 n T ( i ) + T ( n i ) T(n)=O(\sqrt{n})+\sum_{i=1}^{\sqrt{n}}{T(i)+T(\frac{n}{i})} T(n)=O(n )+i=1n T(i)+T(in),这里只展开一层就可以了,更深层的复杂度是高阶小量我们不进行考虑了,于是有 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(\sqrt{\frac{n}{i}})}=O(n^\frac{3}{4}) T(n)=i=1n O(i )+O(in )=O(n43)
再优化一下,我们知道 φ ( n ) \varphi(n) φ(n) 是一个积性函数,可以运用线性筛法进行预处理。于是我们预处理前 k k k φ ( n ) \varphi(n) φ(n) 并前缀和计算 ϕ ( n ) \phi(n) ϕ(n)(这里我们让 k ≥ ( n ) k \ge \sqrt(n) k( n)),则有 T ( n ) = ∑ i = 1 n k n i = O ( n k ) T(n)=\sum_{i=1}^{\frac{n}{k}}{\sqrt{\frac{n}{i}}}=O(\frac{n}{\sqrt{k}}) T(n)=i=1knin =O(k n)。于是可以知道当 k k k 取到 n 2 3 n^\frac{2}{3} n32 的时候复杂度最优,为 O ( n 2 3 ) O(n^\frac{2}{3}) O(n32)
那么问题来了,我们利用的 ∑ d ∣ n φ ( d ) = n \sum_{d|n}{\varphi(d)}=n dnφ(d)=n 到底本质上是什么原理呢?让我们改变一下形式看看。

∑ i = 1 n i = ∑ i = 1 n ∑ d [ d ∣ i ] ⋅ φ ( d ) = ∑ i d = 1 n ∑ d = 1 ⌊ n i d ⌋ φ ( d ) = ∑ i = 1 n ϕ ( ⌊ n i ⌋ ) \sum_{i=1}^{n}{i}=\sum_{i=1}^{n}\sum_{d}{[d|i]\cdot\varphi(d)}\\=\sum_{\frac{i}{d}=1}^{n}\sum_{d=1}^{\left\lfloor\frac{n}{\frac{i}{d}}\right\rfloor}{\varphi(d)}=\sum_{i=1}^{n}{\phi(\lfloor\frac{n}{i}\rfloor)} i=1ni=i=1nd[di]φ(d)=di=1nd=1dinφ(d)=i=1nϕ(in)
这是不是就是运用到了狄利克雷卷积,把欧拉函数和恒等函数卷了起来,得到了 φ ∗ I = i d \varphi*I=id φI=id

因此本质上,我们要做的事情便是通过狄利克雷卷积构造一个更好计算前缀和的函数,且用于卷积的另一个函数也易计算,则可以简化计算过程。

形式化的推导

我们考虑当前有一个积性函数 f ( n ) f(n) f(n),要求计算 S ( n ) = ∑ i = 1 n f ( i ) S(n)=\sum_{i=1}^{n}{f(i)} S(n)=i=1nf(i)
我们取积性函数 g ( i ) g(i) g(i),计算 f f f g g g 的狄利克雷卷积,有 ( f ∗ g ) ( n ) = ∑ d ∣ n g ( d ) f ( n d ) (f*g)(n)=\sum_{d|n}g(d)f(\frac{n}{d}) (fg)(n)=dng(d)f(dn)
于是有
∑ i = 1 n ( f ∗ g ) ( i ) = ∑ i = 1 n ∑ d ∣ i f ( d ) ⋅ g ( n d ) \sum_{i=1}^{n}{(f*g)(i)}=\sum_{i=1}^{n}\sum_{d|i}{f(d)\cdot g(\frac{n}{d})} i=1n(fg)(i)=i=1ndif(d)g(dn)
我们改变枚举顺序,将原本的枚举 i i i 以及 i i i 的约数改为枚举 d d d 并枚举 d d d 的倍数
则有
原 式 = ∑ d = 1 n ∑ i = 1 n d f ( i ) g ( d ) = ∑ d = 1 n g ( d ) ∑ i = 1 n d f ( i ) = ∑ d = 1 n g ( d ) S ( n d ) 原式=\sum_{d=1}^{n}\sum_{i=1}^{\frac{n}{d}}{f(i)g(d)}\\=\sum_{d=1}^{n}g(d)\sum_{i=1}^{\frac{n}{d}}f(i)\\=\sum_{d=1}^{n}g(d)S(\frac{n}{d}) =d=1ni=1dnf(i)g(d)=d=1ng(d)i=1dnf(i)=d=1ng(d)S(dn)
于是有
g ( 1 ) S ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ d = 1 n g ( d ) S ( n d ) g(1)S(n)=\sum_{i=1}^{n}{(f*g)(i)}-\sum_{d=1}^{n}g(d)S(\frac{n}{d}) g(1)S(n)=i=1n(fg)(i)d=1ng(d)S(dn)
其中 ∑ d = 1 n g ( d ) S ( n d ) \sum_{d=1}^{n}g(d)S(\frac{n}{d}) d=1ng(d)S(dn) 可以通过数论分块来以较优的复杂度进行计算。
形式化地,我们只需要构造一个便于计算的函数 g ( n ) g(n) g(n),将其与要求前缀和的原函数 f ( n ) f(n) f(n) 进行狄利克雷卷积,若是卷积之后的函数也便于计算,我们就可以以较优的复杂度解决问题。

例2:第n个含大于1平方因子的数

求第 n n n 个含大于 1 1 1 平方因子的数。( n ≤ 1 0 18 n\le 10^{18} n1018 )

题解

关于平方因子,我们考虑利用莫比乌斯函数的性质(其取0值的时候必定含有大于 1 1 1 的平方因子。
因此我们记 S ( n ) = ∑ i = 1 n μ 2 ( i ) S(n)=\sum_{i=1}^{n}\mu^2(i) S(n)=i=1nμ2(i),于是我们要取的 a n s ans ans 就是 a n s − s a n s = n ans-s_{ans}=n anssans=n
接下来我们考虑二分,这是显而易见的,重点在于如何高效计算 S ( n ) S(n) S(n)
我们知道有一个关于莫比乌斯函数平方的性质,即 μ n 2 = ∑ d 2 ∣ n μ d \mu_n^2=\sum_{d^2|n} \mu_d μn2=d2nμd,那么就有
s n = ∑ i = 1 n μ n 2 = ∑ i = 1 n ∑ d 2 ∣ n μ d = ∑ d = 1 n μ d ⌊ n d 2 ⌋ s_n=\sum_{i=1}^n \mu_n^2=\sum_{i=1}^n \sum_{d^2|n} \mu_d=\sum_{d=1}^{ \sqrt{n}} \mu_d {\left\lfloor{n\over{d^2}}\right\rfloor} sn=i=1nμn2=i=1nd2nμd=d=1n μdd2n
考虑运用数论分块的思想,把 S ( n ) S(n) S(n) 分成 S 1 ( n ) S_1(n) S1(n) S 2 ( n ) S_2(n) S2(n) 两个部分,分别以 d d d ⌊ n d 2 ⌋ \left\lfloor{n\over{d^2}}\right\rfloor d2n 来计算。
取一个 ⌊ n d 2 ⌋ = k ≈ n 1 3 \lfloor{n\over{d^2}}\rfloor=k\approx n^{\frac{1}{3}} d2n=kn31 作为分界线。令此时 d d d 的取值为 ( d 1 , d 2 ] (d_1,d_2] (d1,d2],则有:
n d 1 2 ≥ k + 1 ⇒ d 1 ≤ n k + 1 ⇒ d 1 = ⌊ n k + 1 ⌋ \frac{n}{d_1^2}\ge k+1 \Rightarrow d_1 \le \sqrt{n\over k+1} \Rightarrow d_1 =\left\lfloor{ \sqrt{n\over k+1} }\right\rfloor d12nk+1d1k+1n d1=k+1n
n d 2 2 ≥ k ⇒ d 2 = ⌊ n k ⌋ \frac{n}{d_2^2}\ge k \Rightarrow d_2 = \left\lfloor{ \sqrt{n\over k} }\right\rfloor d22nkd2=kn
于是我们知道了分界线的取值。设 x i = ⌊ n i ⌋ x_i=\left\lfloor{ \sqrt{\frac{n}{i}} }\right\rfloor xi=in ,则我们可以知道 S ( n ) = S 1 ( n ) + S 2 ( n ) = ∑ d = 1 x k + 1 μ ( d ) ⌊ n d 2 ⌋ + ∑ i = 1 n i ∑ j = x i + 1 + 1 x i μ ( j ) = ∑ d = 1 x k + 1 μ ( d ) ⌊ n d 2 ⌋ + ∑ i = 1 n i ⋅ ( M ( x i ) − M ( x i + 1 ) ) S(n)=S_1(n)+S_2(n)=\sum_{d=1}^{x_{k+1}}\mu(d)\left\lfloor{n\over{d^2}}\right\rfloor+\sum_{i=1}^{n}i\sum_{j=x_{i+1}+1}^{x_i}\mu(j)\\ =\sum_{d=1}^{x_{k+1}}\mu(d)\left\lfloor{n\over{d^2}}\right\rfloor+\sum_{i=1}^{n}i\cdot(M(x_i)-M(x_{i+1})) S(n)=S1(n)+S2(n)=d=1xk+1μ(d)d2n+i=1nij=xi+1+1xiμ(j)=d=1xk+1μ(d)d2n+i=1ni(M(xi)M(xi+1))
于是 S 1 S_1 S1 显然可以快速计算了让我们略过,接下来考虑 S 2 S_2 S2
首先先计算一下梅滕斯函数 M ( n ) = ∑ i = 1 n μ ( i ) M(n)=\sum_{i=1}^{n}{\mu(i)} M(n)=i=1nμ(i)
有了例1的经验,显然可以利用 [ n = 1 ] = ∑ d ∣ n μ ( d ) [n=1]=\sum_{d|n}{\mu(d)} [n=1]=dnμ(d) 来推导:
1 = ∑ i = 1 n [ i = 1 ] = ∑ i = 1 n ∑ d ∣ i μ ( d ) = ∑ i = 1 n ∑ d = 1 ⌊ n i ⌋ μ ( d ) = ∑ i = 1 n M ( ⌊ n i ⌋ ) 1=\sum_{i=1}^{n}{[i=1]}=\sum_{i=1}^{n}\sum_{d|i}{\mu(d)}\\ =\sum_{i=1}^{n}\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}{\mu(d)}=\sum_{i=1}^{n}{M(\lfloor\frac{n}{i}\rfloor)} 1=i=1n[i=1]=i=1ndiμ(d)=i=1nd=1inμ(d)=i=1nM(in)
然后又由于这个 M ( x i ) M(x_i) M(xi) 的分布在上面计算 M ( n ) M(n) M(n) 的时候较容易出现重复,所以其实你只需要在杜教筛求 M ( n ) M(n) M(n) 的时候记忆化就可以了。
最后结论是这个值趋于 n 1 − 6 π 2 n\over{1-{6\over \pi^2}} 1π26n,在值域附近二分即可。

代码

//Night's template
//orzakyrt
#include <bits/stdc++.h>
#define R register
#define LL long long
#ifdef __DEBUG__
	#define Debug (fprintf(stderr,"orzyrt\n"),fflush(stderr))
	#define debug(__a...) (fprintf(stderr,__a),fflush(stderr))
	#define setfile(__a) ('orzyrt')
	#define Compile(__a) system("g++ "__a".cpp -lm -o "__a)
#else
	#define Debug ('orzyrt')
	#define debug(__a...) ('orzyrt')
	#define setfile(__a) freopen(__a".in","r",stdin);freopen(__a".out","w",stdout)
	#define Compile(__a) ('orzyrt')
#endif
template<class TT>inline TT Max(R TT a,R TT b){return a<b?b:a;}
template<class TT>inline TT Min(R TT a,R TT b){return a<b?a:b;}
template<class TT>inline TT Abs(R TT a){return a<0?-a:a;}
template<class TT>inline TT cmin(R TT &a,R TT b){(b<a)&&(a=b);}
template<class TT>inline TT cmax(R TT &a,R TT b){(a<b)&&(a=b);}
using namespace std;
template<class TT>inline void read(R TT &x){
	x=0;R bool f=false;R char c=getchar();
	for(;c<48||c>57;c=getchar())f|=(c=='-');
	for(;c>47&&c<58;c=getchar())x=(x<<1)+(x<<3)+(c^48);
	(f)&&(x=-x);
}
//end template

namespace Night{
	const int maxn = 50000010;
	int pr[maxn>>3],*p=pr;
	bool np[maxn];
	int mu2[maxn],mu[maxn];
	map<int,int>mp;
	inline void sieve(){
		mu2[1]=mu[1]=1;
		for(R int i=2;i<maxn;++i){
			if(!np[i])*++p=i,mu[i]=-1;
			for(R int *j=pr+1;j<=p && i**j<maxn;++j){
				np[i**j]=1;
				if(i%*j)mu[i**j]=-mu[i];
				else{mu[i**j]=0;break;}
			}
		}
		for(R int i=2;i<maxn;++i){
			mu2[i]=mu2[i-1]+(mu[i]?1:0);
			mu[i]+=mu[i-1];
		}
	}
	int smu(R int n){
		if(n<maxn)return mu[n];
		if(mp.count(n))return mp[n];
		R int ret=1;
		for(R int i=2,j,k;i<=n;i=j+1){
			k=n/i;j=n/k;
			ret-=smu(k)*(j-i+1);
		}
		return mp[n]=ret;
	}
	inline LL calc(R LL n){
		if(n<maxn)return mu2[n];
		R LL ret=0,lst=0,t,i=1;
		for(;i*i*i<=n;++i,lst=t)ret+=(n/(i*i))*((t=mu[i])-lst);
		for(ret-=(t=n/(i*i))*lst;t;t--)ret+=smu(sqrt(n/t));
		return ret;
	}
	LL n,ans;
	const long double pi=acos(-1);
	int main(){
		sieve();
		read(n);
		R LL l,r,mid;
		l=n/(1-6/pi/pi),r=l+400000,l-=400000;
		l=max(l,1ll);
		while(l<=r){
			mid=l+r>>1;
			if(mid-calc(mid)>=n)ans=mid,r=mid-1;
			else l=mid+1;
		}
		cout<<ans;
		return 0;
	}
}
int main(){
	return Night::main();
}

例3:卷积的构造


f ( n ) = ∑ i = 1 n ∑ j = 1 i j ( i , j ) f(n)=\sum_{i=1}^{n}{\sum_{j=1}^{i}{\frac{j}{(i,j)}}} f(n)=i=1nj=1i(i,j)j
我们先想办法把 f ( n ) f(n) f(n) 化成积性函数前缀和的形式。
A ( n ) = ∑ i = 1 n i ( n , i ) A(n)=\sum_{i=1}^{n}{\frac{i}{(n,i)}} A(n)=i=1n(n,i)i,将其先化简:
A ( n ) = ∑ i = 1 n i ( n , i ) = ∑ i = 1 n ∑ d ∣ n [ ( n , i ) = d ] ⋅ i d = ∑ d ∣ n ∑ i d = 1 n d [ ( n d , i d ) = 1 ] ⋅ i d = 1 2 ( 1 + ∑ d ∣ n d ⋅ φ ( d ) ) A(n)=\sum_{i=1}^{n}{\frac{i}{(n,i)}}\\ =\sum_{i=1}^{n}\sum_{d|n}{[(n,i)=d]\cdot\frac{i}{d}}\\ =\sum_{d|n}\sum_{\frac{i}{d}=1}^{\frac{n}{d}}{[(\frac{n}{d},\frac{i}{d})=1]\cdot\frac{i}{d}}\\=\frac{1}{2}(1+\sum_{d|n}{d\cdot\varphi(d)}) A(n)=i=1n(n,i)i=i=1ndn[(n,i)=d]di=dndi=1dn[(dn,di)=1]di=21(1+dndφ(d))
于是令函数 g ( n ) = 2 ⋅ f ( n ) − n g(n)=2\cdot f(n)-n g(n)=2f(n)n,类似之前推的式子,有:
G ( n ) = 2 ⋅ F ( n ) − n = ∑ i = 1 n ∑ d ∣ i d ⋅ φ ( d ) = ∑ i = 1 n ∑ d = 1 ⌊ n i ⌋ d ⋅ φ ( d ) G(n)=2\cdot F(n)-n\\ =\sum_{i=1}^{n}\sum_{d|i}{d\cdot\varphi(d)}\\ =\sum_{i=1}^{n}\sum_{d=1}^{\lfloor\frac{n}{i}\rfloor}{d\cdot\varphi(d)} G(n)=2F(n)n=i=1ndidφ(d)=i=1nd=1indφ(d)
因此我们要求一个这样的积性函数的前缀和 A ( n ) = ∑ i = 1 n i ⋅ φ ( i ) A(n)=\sum_{i=1}^{n}{i\cdot\varphi(i)} A(n)=i=1niφ(i),我们把 n n n 表示为质数次幂的形式,有
∑ d ∣ n d ⋅ φ ( d ) = ∏ i = 1 t ∑ j = 0 k i p i j ⋅ φ ( p i j ) = ∏ i = 1 t p i 2 k i + 1 + 1 p i + 1 \sum_{d|n}{d\cdot\varphi(d)}=\prod_{i=1}^{t}\sum_{j=0}^{k_i}{p_i^j\cdot\varphi(p_i^j)}=\prod_{i=1}^{t}\frac{p_i^{2k_i+1}+1}{p_i+1} dndφ(d)=i=1tj=0kipijφ(pij)=i=1tpi+1pi2ki+1+1
这并不好计算,但是由于 ( i d ⋅ φ ) ∗ i d = i d 2 (id\cdot\varphi)*id=id^2 (idφ)id=id2,则(根据上面推的式子)有
n ⋅ ( n + 1 ) ⋅ ( 2 n + 1 ) 6 = ∑ i = 1 n i 2 = ∑ i = 1 n ∑ d ∣ i d ⋅ φ ( d ) ⋅ i d = ∑ i d = 1 n i d ⋅ ∑ d = 1 ⌊ n i d ⌋ d ⋅ φ ( d ) = ∑ i = 1 n i ⋅ A ( ⌊ n i ⌋ ) \frac{n\cdot(n+1)\cdot(2n+1)}{6}=\sum_{i=1}^{n}{i^2}\\ =\sum_{i=1}^{n}{\sum_{d|i}{d\cdot\varphi(d)\cdot\frac{i}{d}}}\\ =\sum_{\frac{i}{d}=1}^{n}{\frac{i}{d}\cdot\sum_{d=1}^{\left\lfloor\frac{n}{\frac{i}{d}}\right\rfloor}{d\cdot\varphi(d)}}\\ =\sum_{i=1}^{n}{i\cdot A(\lfloor\frac{n}{i}\rfloor)} 6n(n+1)(2n+1)=i=1ni2=i=1ndidφ(d)di=di=1ndid=1dindφ(d)=i=1niA(in)
那么
A ( n ) = n ⋅ ( n + 1 ) ⋅ ( 2 n + 1 ) 6 − ∑ i = 2 n i ⋅ A ( ⌊ n i ⌋ ) A(n)=\frac{n\cdot(n+1)\cdot(2n+1)}{6}-\sum_{i=2}^{n}{i\cdot A(\lfloor\frac{n}{i}\rfloor)} A(n)=6n(n+1)(2n+1)i=2niA(in)
于是原问题就可以预处理前 O ( n 2 3 ) O(n^{2\over 3}) O(n32) 个以后在 O ( n 2 3 log ⁡ ( n ) ) O(n^{2\over 3}\log(n)) O(n32log(n)) 的时间复杂度下解决。
(代码懒得写了)


  1. [ α ] \left[\alpha \right] [α] 表示表达式 α \alpha α 的真值。 ↩︎

  2. 证明可以考虑将 i n ( 1 ≤ i ≤ n ) \frac{i}{n}(1\le i \le n) ni(1in) 化为最简分数的思路,此处不再赘述。 ↩︎

  3. 考虑将莫比乌斯函数视为容斥的系数即可。 ↩︎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值