杜教篩
- 前言
- 一、前置知識
- 0.初等數論基礎
- 1.杜教篩解決什么問題?
- 2. 積性函式與線性篩求積性函式
- 3.狄利克雷卷積
- 4.整除分塊
- 二、杜教篩
- 1.式子推導
- 2.例題
- 2.1 例題一
- 2.1.1 問題分析
- 2.1.2 代碼實作
- 2.2.1 式子推導:
- 2.2 i d ? μ = φ 的 證 明 id*\mu = \varphi的證明 id?μ=φ的證明
- 2.3 繼續推導
- 2.4 代碼實作
- 三、總結
前言
實際上本次例題涉及的杜教篩不麻煩,麻煩的是例題的式子的推導與變換,后續更新其他例題,陸續更新博客內容~
涉及前置知識點:線性篩求積性函式,整除分塊,積性函式的性質,狄利克雷卷積
一、前置知識
0.初等數論基礎
整除、質數、約數、算識訓本定理,詳見博客:數論學習筆記-初等數論基礎
1.杜教篩解決什么問題?
解決積性函式求前綴和的問題,它可以在非線性時間內求積性函式前綴和,為什么要使用杜教篩?不能用線性篩篩積性函式嗎?
答:線性篩只適用于1e8以下的求積性函式前綴和問題,因為復雜度是O(n),而當n>1e9時,就會超時,而杜教篩可以解決n = 1e11的積性函式求前綴和問題,杜教篩演算法的時間復雜度是
O
(
n
2
3
)
O(n^{\frac 2 3})
O(n32?)
2. 積性函式與線性篩求積性函式
積性函式:對于任意互質的整數 a,b有 f(a×b)=f(a)×f(b)的數論函式,
完全積性函式:對于任意整數 a,ba,b 有 f(a×b)=f(a)×f(b)的數論函式,
常見的積性函式:
μ
,
φ
,
?
,
i
d
,
I
,
δ
,
d
μ
:
莫
比
烏
斯
函
數
φ
:
歐
拉
函
數
?
:
單
位
元
函
數
i
d
:
單
位
函
數
I
:
恒
等
函
數
δ
:
約
數
和
函
數
d
:
約
數
個
數
函
數
,
也
叫
除
數
函
數
\mu,\varphi,\epsilon,id,I,\delta,d\\ \mu:莫比烏斯函式\\ \varphi:歐拉函式\\ \epsilon:單位元函式\\ id:單位函式\\ I:恒等函式\\ \delta:約數和函式\\ d:約數個數函式,也叫除數函式
μ,φ,?,id,I,δ,dμ:莫比烏斯函數φ:歐拉函數?:單位元函數id:單位函數I:恒等函數δ:約數和函數d:約數個數函數,也叫除數函數
線性篩求積性函式詳見博客:數論學習筆記之積性函式與篩法求積性函式
3.狄利克雷卷積

?狄利克雷卷積滿足交換律和結合律
結合狄利克雷卷積得到的幾個積性函式之間性質:
μ
?
I
=
?
?
I
=
I
?
I
=
d
φ
?
I
=
i
d
?
I
=
δ
\mu*I = \epsilon*I = I*I = d\\ \varphi*I = id*I = \delta
μ?I=??I=I?I=dφ?I=id?I=δ
4.整除分塊
詳情見另一篇博客:整除分塊筆記1
二、杜教篩
1.式子推導
這里給出杜教篩的式子推導:
令
h
=
f
?
g
,
g
為
要
求
的
函
數
適
用
條
件
,
如
果
∑
i
=
1
n
h
(
i
)
好
求
,
∑
i
=
1
n
f
(
i
)
也
好
求
那
么
∑
i
=
1
n
g
(
i
)
就
好
求
,
令
H
(
n
)
=
∑
i
=
1
n
h
(
i
)
=
∑
i
=
1
n
(
f
?
g
)
(
i
)
令
S
(
n
)
=
∑
i
=
1
n
g
(
i
)
(
1
)
根
據
迪
利
克
雷
卷
積
定
義
:
有
H
(
n
)
=
∑
i
=
1
n
(
f
?
g
)
(
i
)
=
∑
i
=
1
n
∑
d
∣
i
f
(
d
)
g
(
i
d
)
=
∑
i
=
1
n
∑
d
=
1
n
f
(
d
)
g
(
i
d
)
[
d
∣
i
]
,
再
令
i
=
i
1
d
,
=
∑
d
=
1
n
∑
i
1
d
=
1
n
f
(
d
)
g
(
i
1
d
d
)
[
d
∣
i
1
d
]
=
∑
d
=
1
n
∑
i
1
d
=
1
n
f
(
d
)
g
(
i
1
)
=
∑
d
=
1
n
∑
i
=
1
n
d
f
(
d
)
g
(
i
)
=
∑
d
=
1
n
f
(
d
)
∑
i
=
1
n
d
g
(
i
)
=
∑
d
=
1
n
f
(
d
)
S
(
n
d
)
取
出
第
1
項
,
(
為
什
么
取
第
1
項
?
)
則
有
H
(
n
)
=
f
(
1
)
S
(
n
)
+
∑
d
=
2
n
f
(
d
)
S
(
n
d
)
f
(
1
)
S
(
n
)
=
H
(
n
)
?
∑
d
=
2
n
f
(
d
)
S
(
n
d
)
S
(
n
)
=
H
(
n
)
?
∑
d
=
2
n
f
(
d
)
S
(
n
d
)
f
(
1
)
這
里
S
(
n
)
就
得
到
了
,
后
面
的
式
子
可
以
整
除
分
塊
求
,
\begin{aligned} &令h = f*g,g為要求的函式\\ &適用條件,如果\sum_{i=1}^nh(i)好求,\sum_{i=1}^nf(i)也好求\\ &那么\sum_{i=1}^ng(i)就好求,\\ &令H(n) = \sum_{i=1}^nh(i) = \sum_{i=1}^n(f*g)(i)\\ &令S(n) = \sum_{i=1}^ng(i)\\ &(1)根據迪利克雷卷積定義:\\ &有H(n)=\sum_{i=1}^n(f*g)(i)= \sum_{i=1}^n\sum_{d|i}f(d)g(\frac i d)\\ &=\sum_{i=1}^n\sum_{d=1}^nf(d)g(\frac i d)[d|i],再令i = i_1d,\\ &=\sum_{d=1}^n\sum_{i_1d=1}^nf(d)g(\frac {i_1d} d)[d|i_1d]\\ &=\sum_{d=1}^n\sum_{i_1d=1}^nf(d)g(i_1)\\ &=\sum_{d=1}^n\sum_{i=1}^\frac n df(d)g(i)\\ &=\sum_{d=1}^nf(d)\sum_{i=1}^\frac n dg(i)\\ &=\sum_{d=1}^nf(d)S(\frac n d)\\ &取出第1項,(為什么取第1項?)\\ &則有H(n) = f(1)S(n)+\sum_{d=2}^nf(d)S(\frac n d)\\ &f(1)S(n) = H(n)-\sum_{d=2}^nf(d)S(\frac n d)\\ &S(n) = \frac {H(n)-\sum_{d=2}^nf(d)S(\frac n d)}{f(1)}\\ &這里S(n)就得到了,后面的式子可以整除分塊求, \end{aligned}
?令h=f?g,g為要求的函數適用條件,如果i=1∑n?h(i)好求,i=1∑n?f(i)也好求那么i=1∑n?g(i)就好求,令H(n)=i=1∑n?h(i)=i=1∑n?(f?g)(i)令S(n)=i=1∑n?g(i)(1)根據迪利克雷卷積定義:有H(n)=i=1∑n?(f?g)(i)=i=1∑n?d∣i∑?f(d)g(di?)=i=1∑n?d=1∑n?f(d)g(di?)[d∣i],再令i=i1?d,=d=1∑n?i1?d=1∑n?f(d)g(di1?d?)[d∣i1?d]=d=1∑n?i1?d=1∑n?f(d)g(i1?)=d=1∑n?i=1∑dn??f(d)g(i)=d=1∑n?f(d)i=1∑dn??g(i)=d=1∑n?f(d)S(dn?)取出第1項,(為什么取第1項?)則有H(n)=f(1)S(n)+d=2∑n?f(d)S(dn?)f(1)S(n)=H(n)?d=2∑n?f(d)S(dn?)S(n)=f(1)H(n)?∑d=2n?f(d)S(dn?)?這里S(n)就得到了,后面的式子可以整除分塊求,?
2.例題
2.1 例題一
luoguP4213
求:
a
n
s
1
=
∑
i
=
1
n
φ
(
i
)
a
n
s
2
=
∑
i
=
1
n
μ
(
i
)
ans1 = \sum_{i=1}^n\varphi(i)\\ ans2 =\sum_{i=1}^n\mu(i)
ans1=i=1∑n?φ(i)ans2=i=1∑n?μ(i)

2.1.1 問題分析
2
31
=
2
,
147
,
483
,
648
≈
2.2
e
9
,
且
T
=
10
,
則
總
時
間
最
壞
是
2.2
e
10
顯
然
O
(
n
)
會
超
時
,
考
慮
使
用
杜
教
篩
,
杜
教
篩
的
直
接
時
間
復
雜
度
是
O
(
n
3
4
)
可
以
使
用
線
性
篩
預
處
理
大
概
5
e
6
1
e
7
的
數
據
然
后
用
m
a
p
存
大
的
數
據
,
這
樣
可
以
將
時
間
復
雜
度
優
化
到
O
(
n
2
3
)
,
關
于
證
明
見
2^{31} = 2,147,483,648≈2.2e9,且T = 10,則總時間最壞是2.2e10\\ 顯然O(n)會超時,考慮使用杜教篩,杜教篩的直接時間復雜度是O(n^{\frac 3 4})\\ 可以使用線性篩預處理大概5e6~1e7的資料然后用map存大的資料,這樣\\ 可以將時間復雜度優化到O(n^{\frac 2 3}),關于證明見
231=2,147,483,648≈2.2e9,且T=10,則總時間最壞是2.2e10顯然O(n)會超時,考慮使用杜教篩,杜教篩的直接時間復雜度是O(n43?)可以使用線性篩預處理大概5e6 1e7的數據然后用map存大的數據,這樣可以將時間復雜度優化到O(n32?),關于證明見
P4213題解的第一篇題解里有杜教篩時間復雜度的證明,
再由積性函式的性質有:
φ
?
I
=
i
d
,
μ
?
I
=
?
\varphi*I = id,\mu*I = \epsilon
φ?I=id,μ?I=?
根據杜教篩推導公式以及設定要求的函式:
要
求
∑
i
=
1
n
φ
(
i
)
,
直
接
令
f
=
φ
,
g
=
I
,
則
h
=
f
?
g
=
μ
?
I
=
i
d
那
么
只
要
g
的
前
綴
和
好
求
,
h
的
前
綴
和
好
求
,
那
么
f
的
前
綴
和
就
好
求
由
于
過
于
好
求
,
套
用
杜
教
篩
直
接
可
以
得
出
g
的
前
綴
和
公
式
:
S
(
n
)
=
H
(
n
)
?
∑
d
=
2
n
f
(
d
)
S
(
n
d
)
f
(
1
)
這
里
f
(
1
)
=
1
,
H
(
n
)
=
∑
i
=
1
n
i
d
(
i
)
=
n
?
(
n
+
1
)
2
則
S
(
n
)
=
n
?
(
n
+
1
)
2
?
∑
d
=
2
n
d
?
S
(
n
d
)
前
面
可
以
O
(
1
)
求
于
是
只
需
要
整
除
分
塊
求
∑
d
=
2
n
?
S
(
n
d
)
總
時
間
復
雜
度
為
O
(
n
)
μ
函
數
的
前
綴
和
分
析
同
理
,
要求\sum_{i=1}^n\varphi(i),直接令f = \varphi,g = I,則h = f*g = \mu*I = id\\ 那么只要g的前綴和好求,h的前綴和好求,那么f的前綴和就好求\\ 由于過于好求,套用杜教篩直接可以得出g的前綴和公式:\\ S(n) = \frac {H(n)-\sum_{d=2}^nf(d)S(\frac n d)}{f(1)}\\ 這里f(1) = 1,H(n) = \sum_{i=1}^nid(i) = \frac{n*(n+1)} 2\\ 則S(n) = \frac{n*(n+1)} 2-\sum_{d=2}^nd\cdot S(\frac n d)\\ 前面可以O(1)求于是只需要整除分塊求\sum_{d=2}^n\cdot S(\frac n d)\\ 總時間復雜度為O(\sqrt n)\\ \mu函式的前綴和分析同理,
要求i=1∑n?φ(i),直接令f=φ,g=I,則h=f?g=μ?I=id那么只要g的前綴和好求,h的前綴和好求,那么f的前綴和就好求由于過于好求,套用杜教篩直接可以得出g的前綴和公式:S(n)=f(1)H(n)?∑d=2n?f(d)S(dn?)?這里f(1)=1,H(n)=i=1∑n?id(i)=2n?(n+1)?則S(n)=2n?(n+1)??d=2∑n?d?S(dn?)前面可以O(1)求于是只需要整除分塊求d=2∑n??S(dn?)總時間復雜度為O(n
?)μ函數的前綴和分析同理,
2.1.2 代碼實作
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
typedef long long ll;
ll t,n;
const ll N = 5e6+10;//注意一定要把N開到比篩的范圍多一些,不然會爆
ll primes[N];
ll phi[N],mu[N];
bool st[N];
map<ll,ll>ans_phi;
map<ll,ll>ans_mu;
//雖然可以直接杜教篩,核心內容就是推公式+整除分塊,但是很慢嗚嗚嗚
//正常的杜教篩步驟:
//1.開始硬推公式
//2.套用杜教篩核心公式
//3.O(n)預處理一個想求的函式的前綴和,大概5e7,這一步就是降時間復雜度的
//據說能O(n^(3/4))->O(n^(2/3))證明不會嗚嗚嗚
void init(ll n)
{
//歐拉篩求積性函式,關于歐拉篩求積性函式會另外寫一篇博客
ll cnt = 0;
phi[1] = 1,mu[1] = 1;
for(ll i = 2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++] = i;
mu[i] = -1;
phi[i] = i-1;//由定義出發
}
for(ll j = 0;j<cnt&&i*primes[j]<=n;j++)
{
st[i*primes[j]] = true;
if(i%primes[j]==0)
{
phi[i*primes[j]] = phi[i]*primes[j];
mu[i*primes[j]] = 0;
break;
}
else
{
phi[i*primes[j]] = phi[i]*phi[primes[j]];
mu[i*primes[j]] = -mu[i];
}
}
}
//前綴和累加
for(ll i = 1;i<=n;i++)
phi[i]+= phi[i-1];
for(int i = 1;i<=n;i++)
mu[i] += mu[i-1];
}
ll phiSum(ll n)
{
if(n<=N) return phi[n];
if(ans_phi[n]) return ans_phi[n];
ll ans = n*(n+1)/2;
//主要l從2開始,第一項是S(n)
//這里是整除分塊,
for(ll l = 2,r;l<=n;l = r+1){
r = (n/(n/l));
ans-=(r-l+1)*phiSum(n/l);
}
return ans_phi[n] = ans;//記憶化加速
}
ll muSum(ll n)
{
if(n<=N) return mu[n];
if(ans_mu[n]) return ans_mu[n];
ll ans = 1;
//主要l從2開始,第一項是S(n)
for(ll l = 2,r;l<=n;l = r+1){
r = (n/(n/l));
ans-=(r-l+1)*muSum(n/l);
}
return ans_mu[n] = ans;//記憶化加速
}
int main()
{
scanf("%lld",&t);
init(N);
while(t--)
{
scanf("%lld",&n);
printf("%lld %lld\n",phiSum(n),muSum(n));
}
return 0;
}
LuoguP3768
求:

2.2.1 式子推導:
∑ i = 1 n ∑ j = 1 n i ? j ? g c d ( i , j ) = ∑ i = 1 n ∑ j = 1 n ∑ d = 1 n i ? j ? d [ g c d ( i , j ) = d ] = ∑ d = 1 n d ∑ i = 1 n ∑ j = 1 n i ? j [ g c d ( i , j ) = d ] 令 i = i 1 d , j = j 1 d , 則 = ∑ d = 1 n d ∑ i 1 d = 1 n ∑ j 1 d = 1 n i 1 d ? j 1 d [ g c d ( i 1 d , j 1 d ) = d ] = ∑ d = 1 n d ∑ i 1 d = 1 n ∑ j 1 d = 1 n i 1 d ? j 1 d [ g c d ( i 1 , j 1 ) = 1 ] = ∑ d = 1 n d 3 ∑ i 1 = 1 n d ∑ j 1 = 1 n d i 1 ? j 1 [ g c d ( i 1 , j 1 ) = 1 ] 如 何 化 簡 [ g c d ( i 1 , j 1 = 1 ) ] ? , 我 們 知 道 ? ( n ) = [ n = 1 ] , 即 n = 1 的 時 候 , ? ( n ) = 1 , 否 則 = 0 ∴ [ g c d ( i 1 , j 1 ) = 1 ] = ? ( g c d ( i 1 , j 1 ) ) = ( μ ? I ) ( g c d ( i 1 , j 1 ) ) 而 ( μ ? I ) ( g c d ( i 1 , j 1 ) ) = ∑ d ′ ∣ g c d ( i 1 , j 1 ) μ ( d ′ ) I ( g c d ( i 1 , j 1 ) d ′ ) 則 原 式 = ∑ d = 1 n d 3 ∑ i 1 = 1 n d ∑ j 1 = 1 n d i 1 ? j 1 [ g c d ( i 1 , j 1 ) = 1 ] = ∑ d = 1 n d 3 ∑ i 1 = 1 n d ∑ j 1 = 1 n d i 1 ? j 1 ∑ d ′ ∣ g c d ( i 1 , j 1 ) μ ( d ′ ) I ( g c d ( i 1 , j 1 ) d ′ ) 這 一 步 推 下 一 步 不 太 懂 的 話 不 妨 令 i 1 = x d , j 1 = y d 容 易 證 明 d ∣ g c d ( i , j ) ? d ∣ i , d ∣ j = ∑ d = 1 n d 3 ∑ i 1 = 1 n d ∑ j 1 = 1 n d i 1 ? j 1 ∑ d ′ ∣ i 1 , d ′ ∣ j 1 μ ( d ′ ) = ∑ d = 1 n d 3 ∑ i 1 = 1 n d ∑ j 1 = 1 n d i 1 ? j 1 ∑ d ′ = 1 μ ( d ′ ) [ d ′ ∣ i 1 , d ′ ∣ j 1 ] 同 樣 可 以 令 i 1 = i d ′ , j 1 = j d ′ , 則 原 式 = ∑ d = 1 n d 3 ∑ d ′ = 1 μ ( d ′ ) ∑ i d ′ = 1 n d ∑ j d ′ = 1 n d i d ′ ? j d ′ [ d ′ ∣ i d ′ , d ′ ∣ j d ′ ] ∵ d ′ ∣ i 1 , d ′ ∣ i 2 , 所 以 d ′ = [ 1 , m a x ( i 1 , i 2 ) ] , 即 這 里 d ′ 最 多 枚 舉 到 n d = ∑ d = 1 n d 3 ∑ d ′ = 1 n d μ ( d ′ ) ∑ i d ′ = 1 n d ∑ j d ′ = 1 n d i d ′ ? j d ′ = ∑ d = 1 n d 3 ∑ d ′ = 1 n d μ ( d ′ ) ∑ i = 1 n d d ′ ∑ j = 1 n d d ′ i j ( d ′ ) 2 = ∑ d = 1 n d 3 ∑ d ′ = 1 n d μ ( d ′ ) ( d ′ ) 2 ∑ i = 1 n d d ′ ∑ j = 1 n d d ′ i j 令 T = d d ′ , f ( i ) = ∑ i = 1 n i , 那 么 有 d ∣ T , 默 認 a b 是 下 取 整 , 則 原 式 = ∑ T = 1 n 2 d f 2 ( n T ) ∑ d ∣ T d 3 μ ( T d ) ( T d ) 2 = ∑ T = 1 n f 2 ( n T ) ∑ d ∣ T d 3 μ ( T d ) ( T d ) 2 = ∑ T = 1 n f 2 ( n T ) T 2 ∑ d ∣ T d μ ( T d ) = ∑ T = 1 n f 2 ( n T ) T 2 ∑ d ∣ T i d ( d ) ? μ ( T d ) = ∑ T = 1 n f 2 ( n T ) T 2 ? ( i d ? μ ) ( T ) = ∑ T = 1 n f 2 ( n T ) T 2 ? φ ( T ) \begin{aligned} &\sum_{i=1}^n\sum_{j=1}^ni*j*gcd(i,j)\\ &=\sum_{i=1}^n\sum_{j=1}^n\sum_{d=1}^ni*j*d[gcd(i,j)=d]\\ &=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^ni*j[gcd(i,j)=d]\\ &令i = i_1d,j = j_1d,則\\ &=\sum_{d=1}^nd\sum_{i_1d=1}^n\sum_{j_1d=1}^ni_1d\cdot j_1d[gcd(i_1d,j_1d)=d]\\ &=\sum_{d=1}^nd\sum_{i_1d=1}^n\sum_{j_1d=1}^ni_1d\cdot j_1d[gcd(i_1,j_1)=1]\\ &=\sum_{d=1}^nd^3\sum_{i_1=1}^{\frac{n}{d}}\sum_{j_1=1}^{\frac{n}{d}}i_1\cdot j_1[gcd(i_1,j_1)=1]\\ &如何化簡[gcd(i_1,j_1=1)]?,我們知道\\ &\epsilon(n) = [n=1],即n=1的時候,\epsilon(n)=1,否則=0\\ &\therefore[gcd(i_1,j_1)=1] = \epsilon(gcd(i_1,j_1)) = (\mu*I)(gcd(i_1,j_1))\\ &而(\mu*I)(gcd(i_1,j_1)) = \sum_{d'|gcd(i_1,j_1)}\mu(d')I(\frac{gcd(i_1,j_1)}{d'})則\\ &原式=\sum_{d=1}^nd^3\sum_{i_1=1}^{\frac{n}{d}}\sum_{j_1=1}^{\frac{n}{d}}i_1\cdot j_1[gcd(i_1,j_1)=1]\\ &=\sum_{d=1}^nd^3\sum_{i_1=1}^{\frac{n}{d}}\sum_{j_1=1}^{\frac{n}{d}}i_1\cdot j_1\sum_{d'|gcd(i_1,j_1)}\mu(d')I(\frac{gcd(i_1,j_1)}{d'})\\\\ &這一步推下一步不太懂的話不妨令i_1 = xd,j_1=yd\\ &容易證明d|gcd(i,j)\leftrightarrow d|i,d|j\\ \\ &=\sum_{d=1}^nd^3\sum_{i_1=1}^\frac{n}{d}\sum_{j_1=1}^{\frac{n}{d}}i_1\cdot j_1\sum_{d'|i_1,d'|j_1}\mu(d')\\ &=\sum_{d=1}^nd^3\sum_{i_1=1}^{\frac n d}\sum_{j_1=1}^\frac n di_1\cdot j_1\sum_{d'=1}\mu(d')[d'|i_1,d'|j_1]\\ &同樣可以令i_1 = id',j_1 = jd',則原式\\ &=\sum_{d=1}^nd^3\sum_{d'=1}\mu(d')\sum_{id'=1}^{\frac n d}\sum_{jd'=1}^\frac n did'\cdot jd'[d'|id',d'|jd']\\ & \because d'|i_1,d'|i_2,所以d ' = [1,max(i_1,i_2)],即這里d'最多列舉到\frac n d \\ &=\sum_{d=1}^nd^3\sum_{d'=1}^{\frac n d}\mu(d')\sum_{id'=1}^{\frac n d}\sum_{jd'=1}^\frac n did'\cdot jd'\\ &=\sum_{d=1}^nd^3\sum_{d'=1}^\frac n d\mu(d')\sum_{i=1}^{\frac n {dd'}}\sum_{j=1}^\frac n {dd'}ij(d')^2\\ &=\sum_{d=1}^nd^3\sum_{d'=1}^\frac n d\mu(d')(d')^2\sum_{i=1}^\frac n{dd'}\sum_{j=1}^\frac n {dd'}ij\\ &令T = dd',f(i) = \sum_{i=1}^ni,那么有d|T,默認\frac a b是下取整,則原式\\ &=\sum_{T=1}^{\frac {n^2} d}f^2(\frac n T)\sum_{d|T}d^3\mu(\frac T d)(\frac T d)^2\\ &=\sum_{T=1}^nf^2(\frac n T)\sum_{d|T}d^3\mu(\frac T d)(\frac T d)^2\\ &=\sum_{T=1}^nf^2(\frac n T)T^2\sum_{d|T}d\mu(\frac T d)\\ &=\sum_{T=1}^nf^2(\frac n T)T^2\sum_{d|T}id(d)\cdot \mu(\frac T d)\\ &=\sum_{T=1}^nf^2(\frac n T)T^2\cdot(id*\mu)(T)\\ &=\sum_{T=1}^nf^2(\frac n T)T^2\cdot\varphi(T)\\\\\\ \end{aligned}\\ ?i=1∑n?j=1∑n?i?j?gcd(i,j)=i=1∑n?j=1∑n?d=1∑n?i?j?d[gcd(i,j)=d]=d=1∑n?di=1∑n?j=1∑n?i?j[gcd(i,j)=d]令i=i1?d,j=j1?d,則=d=1∑n?di1?d=1∑n?j1?d=1∑n?i1?d?j1?d[gcd(i1?d,j1?d)=d]=d=1∑n?di1?d=1∑n?j1?d=1∑n?i1?d?j1?d[gcd(i1?,j1?)=1]=d=1∑n?d3i1?=1∑dn??j1?=1∑dn??i1??j1?[gcd(i1?,j1?)=1]如何化簡[gcd(i1?,j1?=1)]?,我們知道?(n)=[n=1],即n=1的時候,?(n)=1,否則=0∴[gcd(i1?,j1?)=1]=?(gcd(i1?,j1?))=(μ?I)(gcd(i1?,j1?))而(μ?I)(gcd(i1?,j1?))=d′∣gcd(i1?,j1?)∑?μ(d′)I(d′gcd(i1?,j1?)?)則原式=d=1∑n?d3i1?=1∑dn??j1?=1∑dn??i1??j1?[gcd(i1?,j1?)=1]=d=1∑n?d3i1?=1∑dn??j1?=1∑dn??i1??j1?d′∣gcd(i1?,j1?)∑?μ(d′)I(d′gcd(i1?,j1?)?)這一步推下一步不太懂的話不妨令i1?=xd,j1?=yd容易證明d∣gcd(i,j)?d∣i,d∣j=d=1∑n?d3i1?=1∑dn??j1?=1∑dn??i1??j1?d′∣i1?,d′∣j1?∑?μ(d′)=d=1∑n?d3i1?=1∑dn??j1?=1∑dn??i1??j1?d′=1∑?μ(d′)[d′∣i1?,d′∣j1?]同樣可以令i1?=id′,j1?=jd′,則原式=d=1∑n?d3d′=1∑?μ(d′)id′=1∑dn??jd′=1∑dn??id′?jd′[d′∣id′,d′∣jd′]∵d′∣i1?,d′∣i2?,所以d′=[1,max(i1?,i2?)],即這里d′最多枚舉到dn?=d=1∑n?d3d′=1∑dn??μ(d′)id′=1∑dn??jd′=1∑dn??id′?jd′=d=1∑n?d3d′=1∑dn??μ(d′)i=1∑dd′n??j=1∑dd′n??ij(d′)2=d=1∑n?d3d′=1∑dn??μ(d′)(d′)2i=1∑dd′n??j=1∑dd′n??ij令T=dd′,f(i)=i=1∑n?i,那么有d∣T,默認ba?是下取整,則原式=T=1∑dn2??f2(Tn?)d∣T∑?d3μ(dT?)(dT?)2=T=1∑n?f2(Tn?)d∣T∑?d3μ(dT?)(dT?)2=T=1∑n?f2(Tn?)T2d∣T∑?dμ(dT?)=T=1∑n?f2(Tn?)T2d∣T∑?id(d)?μ(dT?)=T=1∑n?f2(Tn?)T2?(id?μ)(T)=T=1∑n?f2(Tn?)T2?φ(T)?
2.2 i d ? μ = φ 的 證 明 id*\mu = \varphi的證明 id?μ=φ的證明
i d ? μ = φ 如 何 證 明 ? 兩 種 方 法 第 一 種 證 明 : 由 迪 利 克 雷 卷 積 : i d ? μ = ∑ d ∣ T i d ( d ) μ ( T d ) = ∑ d ∣ T μ ( d ) i d ( T d ) = ∑ d ∣ T μ ( d ) T d . . . . . . . . . . ( 1 ) 現 在 考 慮 φ ( n ) φ ( n ) : 1 ? n 中 所 有 與 n 互 質 的 數 的 個 數 給 出 算 術 基 本 定 理 : n = p 1 a 1 . p 2 a 2 . . . p k a k , ( p 1 . . . p k 互 質 ) 定 義 P i 表 示 1 ? n 中 數 的 質 因 子 里 包 含 p i 的 數 的 個 數 而 且 易 有 P i = ? n p i ? 再 定 義 每 個 i 由 算 術 基 本 定 理 得 到 的 質 因 子 集 合 為 Z i , 令 U 為 全 集 , 則 可 寫 成 數 學 符 號 : P j = ∑ i = 1 n 1 [ ? p j ∈ Z i , i ∈ [ 1 , n ] ] 則 由 定 義 出 發 : φ ( n ) = U ? ? i = 1 k P i , 由 容 斥 原 理 = U ? ? n p 1 ? ? ? n p 2 ? ? . . . ? ? n p k ? + ? n p 1 p 2 ? + ? n p 2 p 3 ? + . . . + ? n p k ? 1 p k ? ? ? n p 1 p 2 p 3 ? . . . + ( ? 1 ) k ? n p 1 p 2 . . . p k ? . . . . . . . . . . . . . . ( 2 ) 觀 察 ( 1 ) 可 得 ( 1 ) = = T + μ ( p 1 ) ? T p 1 + μ ( p 2 ) ? T p 2 + . . . μ ( p k ) ? T p k + μ ( p 1 p 2 ) ? T p 1 p 2 + . . . μ ( p k ? 1 p k ) ? T p k ? 1 p k + . . . + μ ( p 1 p 2 . . . p k ) ? T p 1 p 2 . . . p k . . . . . . . . . . . . ( 3 ) 而 T 實 際 上 是 全 集 U , 由 莫 比 烏 斯 函 數 性 質 , 觀 察 易 知 ( 2 ) 式 ( 3 ) 式 相 等 , 故 i d ? μ = φ 第 二 種 證 明 : 由 莫 比 烏 斯 反 演 有 : 如 果 f ? I = g 則 g ? μ = f 而 我 們 知 道 φ ? I = i d , 則 易 有 i d ? μ = φ , 得 證 \begin{aligned} &id*\mu = \varphi如何證明? 兩種方法\\\\ &第一種證明:\\\\\\ &由迪利克雷卷積:id*\mu = \sum_{d|T}{id(d)}{\mu(\frac T d)}\\ &=\sum_{d|T}\mu(d)id(\frac T d)\\ &=\sum_{d|T}\mu(d)\frac T d..........(1)\\ &\\ &現在考慮\varphi(n)\\ &\varphi(n):1-n中所有與n互質的數的個數\\ &給出算識訓本定理:n = p_1^{a_1}.p_2^{a_2}...p_k^{a_k},(p_1...p_k互質)\\ &定義Pi表示1-n中數的質因子里包含p_i的數的個數\\ &而且易有Pi = \lfloor\frac {n} {p_i}\rfloor\\ &再定義每個i由算識訓本定理得到的質因子集合為Z_i,令U為全集,則可\\ \\&寫成數學符號:Pj = \sum_{i=1}^n1[\exist p_j\in Z_i,i\in[1,n]]\\ \\&則由定義出發:\varphi(n) = U-\bigcup_{i=1}^k Pi,由容斥原理\\ &=U-\lfloor\frac {n} {p_1}\rfloor-\lfloor\frac {n} {p_2}\rfloor-...-\lfloor\frac {n} {p_k}\rfloor+\lfloor\frac {n} {p_1p_2}\rfloor+\lfloor\frac {n} {p_2p_3}\rfloor+...+\lfloor\frac {n} {p_{k-1}p_{k}}\rfloor \\ &-\lfloor\frac {n} {p_1p_2p_3}\rfloor...+(-1)^k\lfloor\frac {n} {p_1p_2...p_k}\rfloor..............(2)\\\\ &觀察(1)可得(1)=\\ &=T+\mu(p_1)\cdot\frac {T}{p_1}+\mu(p_2)\cdot\frac {T}{p_2}+...\mu(p_k)\cdot\frac {T}{p_k}+\mu(p_1p_2)\cdot\frac {T}{p_1p_2}+\\&...\mu(p_{k-1}p_k)\cdot\frac {T}{p_{k-1}{p_k}}+...+\mu(p_1p_2...p_k)\cdot\frac {T}{p_1p_2...p_k}............(3)\\ &而T實際上是全集U,由莫比烏斯函式性質,觀察易知(2)式(3)式相等,故id*\mu=\varphi\\\\ &第二種證明:由莫比烏斯反演有:\\ &如果f*I = g \quad 則g*\mu = f\\ &而我們知道\varphi * I = id,則易有id*\mu = \varphi,得證 \\ \end{aligned} ?id?μ=φ如何證明?兩種方法第一種證明:由迪利克雷卷積:id?μ=d∣T∑?id(d)μ(dT?)=d∣T∑?μ(d)id(dT?)=d∣T∑?μ(d)dT?..........(1)現在考慮φ(n)φ(n):1?n中所有與n互質的數的個數給出算術基本定理:n=p1a1??.p2a2??...pkak??,(p1?...pk?互質)定義Pi表示1?n中數的質因子里包含pi?的數的個數而且易有Pi=?pi?n??再定義每個i由算術基本定理得到的質因子集合為Zi?,令U為全集,則可寫成數學符號:Pj=i=1∑n?1[?pj?∈Zi?,i∈[1,n]]則由定義出發:φ(n)=U?i=1?k?Pi,由容斥原理=U??p1?n????p2?n???...??pk?n??+?p1?p2?n??+?p2?p3?n??+...+?pk?1?pk?n????p1?p2?p3?n??...+(?1)k?p1?p2?...pk?n??..............(2)觀察(1)可得(1)==T+μ(p1?)?p1?T?+μ(p2?)?p2?T?+...μ(pk?)?pk?T?+μ(p1?p2?)?p1?p2?T?+...μ(pk?1?pk?)?pk?1?pk?T?+...+μ(p1?p2?...pk?)?p1?p2?...pk?T?............(3)而T實際上是全集U,由莫比烏斯函數性質,觀察易知(2)式(3)式相等,故id?μ=φ第二種證明:由莫比烏斯反演有:如果f?I=g則g?μ=f而我們知道φ?I=id,則易有id?μ=φ,得證?
2.3 繼續推導
接2.1
原
式
=
∑
T
=
1
n
f
2
(
n
T
)
T
2
?
φ
(
T
)
=
∑
T
=
1
n
f
2
(
n
T
)
i
d
2
(
T
)
?
φ
(
T
)
∑
i
=
1
n
f
2
(
n
T
)
可
以
在
最
外
層
整
除
分
塊
求
需
要
解
決
的
是
i
d
2
(
T
)
?
φ
(
T
)
,
需
要
使
用
杜
教
篩
令
g
=
(
i
d
2
?
φ
)
(
T
)
,
不
妨
設
f
=
i
d
2
,
則
h
=
f
?
g
=
(
i
d
2
?
i
d
2
φ
)
(
T
)
=
∑
d
∣
N
(
i
d
2
?
φ
)
(
T
d
)
i
d
2
(
d
)
=
∑
d
∣
N
i
d
2
(
T
d
)
?
φ
(
T
d
)
i
d
2
(
d
)
=
∑
d
∣
N
(
T
d
)
2
?
φ
(
T
d
)
d
2
=
∑
d
∣
N
T
2
?
φ
(
T
d
)
=
T
2
∑
d
∣
N
?
φ
(
T
d
)
1
(
d
)
=
T
2
(
φ
?
1
)
(
T
)
=
T
2
(
i
d
)
(
T
)
=
T
2
T
=
T
3
h
已
經
推
導
出
,
可
以
O
(
1
)
求
,
現
在
解
決
f
=
i
d
2
很
容
易
推
導
出
∑
i
=
1
n
f
(
i
)
=
i
d
2
(
i
)
=
n
?
(
n
+
1
)
(
2
n
+
1
)
6
這
時
使
用
杜
教
篩
:
S
(
n
)
=
H
(
n
)
?
∑
d
=
2
n
f
(
d
)
S
(
n
d
)
f
(
1
)
對
于
該
式
:
f
(
1
)
=
1
,
S
(
n
)
=
∑
i
=
1
n
g
(
i
)
,
H
(
n
)
=
∑
i
=
1
n
h
(
i
)
=
∑
i
=
1
n
i
3
∴
S
(
n
)
=
∑
i
=
1
n
i
3
?
∑
d
=
2
n
f
(
d
)
S
(
n
d
)
=
[
n
?
(
n
+
1
)
2
]
2
?
∑
d
=
2
n
i
d
2
(
d
)
S
(
n
d
)
于
是
可
以
整
除
分
塊
了
注
意
:
需
要
在
最
外
層
套
用
整
除
分
塊
,
然
后
杜
教
篩
也
需
要
使
用
整
除
分
塊
建
議
仔
細
閱
讀
代
碼
并
實
踐
加
以
理
解
,
\begin{aligned} &原式=\sum_{T=1}^nf^2(\frac n T)T^2\cdot\varphi(T)\\ &=\sum_{T=1}^nf^2(\frac n T)id^2(T)\cdot\varphi(T)\\ &\sum_{i=1}^nf^2(\frac n T)可以在最外層整除分塊求\\ &需要解決的是id^2(T)\cdot\varphi(T),需要使用杜教篩\\ &令g = (id^2\cdot\varphi)(T),不妨設f = id^2,\\&則h = f*g\\ &=(id^2*id^2\varphi)(T)\\ &=\sum_{d|N}(id^2\cdot\varphi)(\frac T d)id^2(d)\\ &=\sum_{d|N}id^2(\frac Td)\cdot\varphi(\frac Td)id^2(d)\\ &=\sum_{d|N}({\frac T d})^2\cdot\varphi(\frac Td)d^2\\ &=\sum_{d|N}T^2\cdot\varphi(\frac T d)\\ &=T^2\sum_{d|N}\cdot\varphi(\frac Td)1(d)\\ &=T^2(\varphi*1)(T)\\ &=T^2(id)(T)\\ &=T^2T\\ &=T^3\\ &h已經推匯出,可以O(1)求,現在解決f = id^2\\ &很容易推匯出\sum_{i=1}^nf(i) = id^2(i) = \frac {n*(n+1)(2n+1)} 6\\ &這時使用杜教篩:\\ &S(n) = \frac {H(n)-\sum_{d=2}^nf(d)S(\frac n d)}{f(1)}\\ &對于該式:f(1) = 1,S(n) = \sum_{i=1}^ng(i),H(n) = \sum_{i=1}^nh(i) = \sum_{i=1}^ni^3\\ & \therefore S(n) = \sum_{i=1}^ni^3 -\sum_{d=2}^nf(d)S(\frac n d)\\ &=[\frac {n*(n+1)}{2}]^2-\sum_{d=2}^nid^2(d) S ( \frac {n}{d})\\ &于是可以整除分塊了\\ & 注意:需要在最外層套用整除分塊,然后杜教篩也需要使用整除分塊\\ &建議仔細閱讀代碼并實踐加以理解, \end{aligned}
?原式=T=1∑n?f2(Tn?)T2?φ(T)=T=1∑n?f2(Tn?)id2(T)?φ(T)i=1∑n?f2(Tn?)可以在最外層整除分塊求需要解決的是id2(T)?φ(T),需要使用杜教篩令g=(id2?φ)(T),不妨設f=id2,則h=f?g=(id2?id2φ)(T)=d∣N∑?(id2?φ)(dT?)id2(d)=d∣N∑?id2(dT?)?φ(dT?)id2(d)=d∣N∑?(dT?)2?φ(dT?)d2=d∣N∑?T2?φ(dT?)=T2d∣N∑??φ(dT?)1(d)=T2(φ?1)(T)=T2(id)(T)=T2T=T3h已經推導出,可以O(1)求,現在解決f=id2很容易推導出i=1∑n?f(i)=id2(i)=6n?(n+1)(2n+1)?這時使用杜教篩:S(n)=f(1)H(n)?∑d=2n?f(d)S(dn?)?對于該式:f(1)=1,S(n)=i=1∑n?g(i),H(n)=i=1∑n?h(i)=i=1∑n?i3∴S(n)=i=1∑n?i3?d=2∑n?f(d)S(dn?)=[2n?(n+1)?]2?d=2∑n?id2(d)S(dn?)于是可以整除分塊了注意:需要在最外層套用整除分塊,然后杜教篩也需要使用整除分塊建議仔細閱讀代碼并實踐加以理解,?
2.4 代碼實作
#include<cstdio>
#include<map>
using namespace std;
typedef long long ll;
const int N = 5e6+210;
bool st[N];
ll primes[N>>2],cnt;
ll phi[N],s[N],mod,n,inv6;
map<ll,ll>ans_s;
//s就是保存的積性函式的值id^2×phi
inline ll read()
{
ll x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
void init(ll n){//預處理S(i)線性篩求積性函式
st[1]=true,phi[1]=1;
for(register int i=2;i<=n;++i){
if(!st[i])primes[++cnt]=i,phi[i]=i-1;
for(ll j=1;j<=cnt&&primes[j]*i<=n;++j){
st[primes[j]*i]=true;
if(i%primes[j]==0){
phi[i*primes[j]]=phi[i]*primes[j];
break;
}
phi[i*primes[j]]=phi[i]*(primes[j]-1);
}
}
for(register int i=1;i<=n;i++){
s[i]=s[i-1]+1LL*i*i%mod*phi[i]%mod;
s[i]%=mod;
}
}
ll qmi(ll a,ll b,ll mod)
{
//快速冪
ll res = 1%mod;
while(b)
{
if(b&1) res = res*a%mod;
b>>=1;
a = a*a%mod;
}
return res;
}
ll f2(ll n)
{
//求平方和
n%=mod;
return n*(n+1)%mod*(2*n+1)%mod*inv6%mod;
}
ll f3(ll n)
{
//求立方和
n%=mod;
return (n*(n+1)/2%mod)*(n*(n+1)/2%mod)%mod;
}
ll Get(ll n)
{
//杜教篩求積性函式前綴和
if(n<=5e6) return s[n]%mod;
if(ans_s[n]) return ans_s[n];
ll ans = f3(n);
for(ll l = 2,r;l<=n;l = r+1)
{
r = n/(n/l);
ans-=(f2(r)-f2(l-1)+mod)%mod*Get(n/l)%mod;
ans = (ans+mod)%mod;
}
return ans_s[n] = ans;
}
ll solve(ll n)
{
ll ans = 0;
for(ll l = 1,r;l<=n;l = r+1)
{
r = n/(n/l);
ans +=f3(n/l)*(Get(r)-Get(l-1)+mod)%mod;
ans = (ans+mod)%mod;
}
return ans;
}
int main()
{
mod = read();n = read();
init(5e6);
inv6 = qmi(6,mod-2,mod);//求6的逆元,在求n^2的前綴和需要用到
printf("%lld",solve(n));
}
三、總結
未完待續~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/416326.html
標籤:AI
