前言
最近学了些数论函数,有了一些小小小小的套路经验
强烈推荐以下几个博客
数论函数变换总结
金策大佬
超详细 课件
狄利克雷卷积
定义:
(
f
×
g
)
(
n
)
=
∑
d
∣
n
f
(
d
)
g
(
n
d
)
(f \times g)(n) = \sum_{d|n} f(d)g(\frac{n}{d})
(f×g)(n)=∑d∣nf(d)g(dn)
方便表示出一些推导过程
随之而来的是数论的一大波函数
e
(
n
)
=
[
n
=
1
]
e(n)=[n=1]
e(n)=[n=1]
i
d
(
n
)
=
n
id(n)=n
id(n)=n
1
(
n
)
=
1
1(n)=1
1(n)=1
d
(
n
)
=
∑
d
∣
n
1
d(n)=\sum_{d|n} 1
d(n)=∑d∣n1 (约数个数)
σ
(
n
)
=
∑
d
∣
n
d
\sigma(n)=\sum_{d|n} d
σ(n)=∑d∣nd
.
.
.
.
....
....
一些数论函数的常见性质
- ∑ d ∣ n ϕ ( d ) = n \sum_{d|n} \phi(d) = n ∑d∣nϕ(d)=n 也就是 i d = ϕ × 1 id = \phi \times 1 id=ϕ×1
- ∑ d ∣ n μ ( d ) = [ n = 1 ] \sum_{d|n} \mu(d) = [n=1] ∑d∣nμ(d)=[n=1] 也就是 e = μ × 1 e = \mu \times 1 e=μ×1
- d ( n m ) = ∑ i ∣ n ∑ j ∣ m [ g c d ( i , j ) = 1 ] d(nm)=\sum_{i|n}\sum_{j|m} [gcd(i,j)=1] d(nm)=∑i∣n∑j∣m[gcd(i,j)=1]
单用这几个性质,就已经能解决不少问题了
同时分享一些小套路
Q1
分析过后会发现每个点
(
i
,
j
)
(i, j)
(i,j)的权值为
g
c
d
(
i
,
j
)
∗
2
−
1
gcd(i, j)*2-1
gcd(i,j)∗2−1
那么关键就是求
∑
i
=
1
n
∑
j
=
1
m
g
c
d
(
i
,
j
)
\sum_{i=1}^n \sum_{j=1}^m gcd(i, j)
∑i=1n∑j=1mgcd(i,j)
求某个数的和,考虑第一个性质(每个数都可以被它的所有约数表示出来)
B
u
t
But
But
w
h
y
?
?
why??
why??
因为gcd太特殊,没什么规律,但gcd的约数是可以轻松枚举的
根据这一点化式子 (小套路)
∑
i
=
1
n
∑
j
=
1
m
∑
d
∣
i
,
j
ϕ
(
d
)
\sum_{i=1}^n \sum_{j=1}^m \sum_{d|i, j} \phi(d)
∑i=1n∑j=1m∑d∣i,jϕ(d)
变换枚举顺序(重要小套路)(
n
≤
m
n\le m
n≤m, 以下都是整除)
∑
d
=
1
n
∑
i
=
1
n
d
∑
j
=
1
m
d
ϕ
(
d
)
\sum_{d=1}^n \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \phi(d)
∑d=1n∑i=1dn∑j=1dmϕ(d)
这么多西格玛算的其实是一个值,所以再化简
∑
d
=
1
n
ϕ
(
d
)
∗
n
d
∗
m
d
\sum_{d=1}^n \phi(d)*\frac{n}{d}*\frac{m}{d}
∑d=1nϕ(d)∗dn∗dm
现在是
O
(
n
)
O(n)
O(n) 可过本题,但还可以再优化(分块)
关键点在整除,很多
n
d
\frac{n}{d}
dn 的值是相同的,这一小块的
ϕ
(
d
)
\phi(d)
ϕ(d) 乘的都是一个值,用一下前缀和即可,变成
O
(
n
)
O(\sqrt{n})
O(n)
其实本题还可用性质2优化(不做详细解说)
∑
d
=
1
n
∑
i
=
1
n
d
∑
j
=
1
m
d
d
∗
[
g
c
d
(
i
,
j
)
=
1
]
\sum_{d=1}^n \sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} d*[gcd(i, j)=1]
∑d=1n∑i=1dn∑j=1dmd∗[gcd(i,j)=1]
∑ d = 1 n d ∗ ( ∑ i = 1 n d ∑ j = 1 m d ∑ d 1 ∣ i , j μ ( d 1 ) ) \sum_{d=1}^n d*(\sum_{i=1}^{\frac{n}{d}} \sum_{j=1}^{\frac{m}{d}} \sum_{d_1|i, j}\mu(d_1) ) ∑d=1nd∗(∑i=1dn∑j=1dm∑d1∣i,jμ(d1))
∑ d = 1 n d ∗ ∑ d 1 = 1 n d ∑ i = 1 n d d 1 ∑ j = 1 m d d 1 μ ( d 1 ) \sum_{d=1}^n d*\sum_{d_1=1}^{\frac{n}{d}} \sum_{i=1}^{\frac{n}{dd_1}} \sum_{j=1}^{\frac{m}{dd_1}}\mu(d_1) ∑d=1nd∗∑d1=1dn∑i=1dd1n∑j=1dd1mμ(d1)
∑ d = 1 n d ∗ ∑ d 1 = 1 n d μ ( d 1 ) ∗ n d d 1 ∗ m d d 1 \sum_{d=1}^n d*\sum_{d_1=1}^{\frac{n}{d}} \mu(d_1)*\frac{n}{dd_1}*\frac{m}{dd_1} ∑d=1nd∗∑d1=1dnμ(d1)∗dd1n∗dd1m
∑ D = 1 n ∑ d ∣ D d ∗ μ ( D d ) ∗ n D ∗ m D \sum_{D=1}^n \sum_{d|D} d*\mu(\frac{D}{d}) * \frac{n}{D} *\frac{m}{D} ∑D=1n∑d∣Dd∗μ(dD)∗Dn∗Dm
∑ D = 1 n ϕ ( D ) ∗ n D ∗ m D \sum_{D=1}^n \phi(D)*\frac{n}{D}*\frac{m}{D} ∑D=1nϕ(D)∗Dn∗Dm
殊途同归
Problem B 与这题类似
问题B代码
LL solve(int n, int m, int k){
n/=k; m/=k;
if(n>m) swap(n,m);
LL last=1, ans=0;
for(int d=1; d<=n; d=last+1){
last=min(n/(n/d), m/(m/d));//分块优化
ans+=(su[last]-su[d-1])*(n/d)*(m/d);//前缀和 su = sum mu
}
/* For(d,1,min(n,m)){
ans+=mu[d]*(n/d)*(m/d); //暴力版
}*/
return ans;
}
int main()
{
scanf("%d",&n);
get_mu();
while(n--){
int a,b,c,d,k;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
printf("%lld\n",solve(b,d,k)-solve(a-1,d,k)-solve(b,c-1,k)+solve(a-1,c-1,k));
}
return 0;
}
Q2
SDOI2015 约数个数和
∑
i
=
1
N
∑
j
=
1
M
d
(
i
j
)
\sum_{i=1}^N \sum_{j=1}^M d(ij)
∑i=1N∑j=1Md(ij)
直接套用第三个性质
∑
i
=
1
N
∑
j
=
1
M
∑
x
∣
i
∑
y
∣
j
[
g
c
d
(
x
,
y
)
=
1
]
\sum_{i=1}^N \sum_{j=1}^M \sum_{x|i} \sum_{y|j} [gcd(x,y)=1]
i=1∑Nj=1∑Mx∣i∑y∣j∑[gcd(x,y)=1]
再套用第二个性质
∑
i
=
1
N
∑
j
=
1
M
∑
x
∣
i
∑
y
∣
j
∑
d
∣
x
,
y
μ
(
d
)
\sum_{i=1}^N\sum_{j=1}^M\sum_{x|i}\sum_{y|j}\sum_{d|x,y}\mu(d)
i=1∑Nj=1∑Mx∣i∑y∣j∑d∣x,y∑μ(d)
变换枚举顺序 (这里的i, j 是原来的x, y)
∑
i
=
1
N
∑
j
=
1
M
∑
d
∣
i
,
j
μ
(
d
)
N
i
M
j
\sum_{i=1}^N\sum_{j=1}^M\sum_{d|i,j}\mu(d)\frac{N}{i}\frac{M}{j}
i=1∑Nj=1∑Md∣i,j∑μ(d)iNjM
再次变换
∑
d
=
1
N
μ
(
d
)
∑
i
=
1
N
d
∑
j
=
1
M
d
N
i
d
M
j
d
\sum_{d=1}^N\mu(d)\sum_{i=1}^{\frac{N}{d}}\sum_{j=1}^{\frac{M}{d}}\frac{N}{id}\frac{M}{jd}
d=1∑Nμ(d)i=1∑dNj=1∑dMidNjdM
这里
i
d
id
id就是原来的
i
i
i
又一个小套路,相同变量放到一起
∑
d
=
1
N
μ
(
d
)
∑
i
=
1
N
d
N
i
d
∑
j
=
1
M
d
M
j
d
\sum_{d=1}^N\mu(d)\sum_{i=1}^{\frac{N}{d}}\frac{N}{id}\sum_{j=1}^{\frac{M}{d}}\frac{M}{jd}
d=1∑Nμ(d)i=1∑dNidNj=1∑dMjdM
设
g
(
x
)
=
∑
i
=
1
x
x
i
g(x)=\sum_{i=1}^x \frac{x}{i}
g(x)=∑i=1xix
则原式即
∑
d
=
1
N
μ
(
d
)
g
(
N
d
)
g
(
M
d
)
\sum_{d=1}^N\mu(d)g(\frac{N}{d})g(\frac{M}{d})
d=1∑Nμ(d)g(dN)g(dM)
O
(
n
n
)
O(n\sqrt{n})
O(nn)预处理
O
(
n
)
O(\sqrt{n})
O(n)求
莫比乌兹反演
奇技淫巧 遇到不会化或不好整的函数用它强行搞成 ∑ d ∣ n . . . \sum_{d|n} ... ∑d∣n... 的形式
f
=
g
×
1
f = g \times 1
f=g×1
g
=
μ
×
f
g=\mu \times f
g=μ×f
YY的GCD
f
(
x
)
=
i
s
P
r
i
m
e
(
x
)
f(x)=isPrime(x)
f(x)=isPrime(x)
设
F
(
x
)
=
∑
d
∣
n
μ
(
x
)
∗
f
(
n
d
)
F(x)=\sum_{d|n} \mu(x)*f(\frac{n}{d})
F(x)=∑d∣nμ(x)∗f(dn)
则
f
(
x
)
=
∑
d
∣
n
F
(
d
)
f(x)=\sum_{d|n} F(d)
f(x)=∑d∣nF(d)
待求式为
∑
x
=
1
n
∑
y
=
1
m
f
(
g
c
d
(
x
,
y
)
)
\sum_{x=1}^n \sum_{y=1}^m f(gcd(x,y))
x=1∑ny=1∑mf(gcd(x,y))
即
∑
x
=
1
n
∑
y
=
1
m
∑
d
∣
x
,
y
F
(
d
)
\sum_{x=1}^n \sum_{y=1}^m \sum_{d|x,y} F(d)
x=1∑ny=1∑md∣x,y∑F(d)
然后就是之前的两个小套路了
关键在于F(x)的求法,即x所有质因子的
μ
\mu
μ 值和,暴力求就行(
O
(
n
l
o
g
(
n
)
)
O(nlog(n))
O(nlog(n))),但可以线性求(我不会)
超大常数代码(现在都不知道哪里常数大了)
For(i,1,prime[0]){
for(int x=1; x*prime[i]<N; x++){
f[x*prime[i]]+=mu[x];
}
}
For(i,1,N-1) F[i]=F[i-1]+f[i];
scanf("%lld%lld",&n,&m);
LL ans=0, last=1;
for(LL i=1; i<=min(n,m); i=last+1){
last=min(n/(n/i), m/(m/i));
ans+=(F[last]-F[i-1])*(n/i)*(m/i);
}
printf("%lld\n",ans);
总结及拓展
-
∑ i n σ ( i ) = ∑ i n i ∗ n i \sum_{i}^n \sigma(i)=\sum_{i}^ni*\frac{n}{i} ∑inσ(i)=∑ini∗in
-
∑ i n σ ( g c d ( i , x ) ) = ∑ i n ∑ d ∣ i , n d = ∑ d ∣ n d n d = n d ( n ) \sum_{i}^n\sigma(gcd(i,x))=\sum_{i}^n\sum_{d|i,n}d=\sum_{d|n}d\frac{n}{d}=nd(n) ∑inσ(gcd(i,x))=∑in∑d∣i,nd=∑d∣nddn=nd(n)
-
∑ i n i [ g c d ( i , n ) = 1 ] = ∑ i n i ∑ d ∣ i , n μ ( d ) = ∑ d ∣ n μ ( d ) ∑ d ∣ i n i = ∑ d ∣ n μ ( d ) n ( n d + 1 ) 2 = n 2 ( ϕ + e ) \sum_{i}^ni[gcd(i,n)=1]=\sum_{i}^ni\sum_{d|i,n}\mu(d)=\sum_{d|n}\mu(d)\sum_{d|i}^n i=\sum_{d|n}\mu(d)\frac{n(\frac{n}{d}+1)}{2}= \frac{n}{2}(\phi + e) ∑ini[gcd(i,n)=1]=∑ini∑d∣i,nμ(d)=∑d∣nμ(d)∑d∣ini=∑d∣nμ(d)2n(dn+1)=2n(ϕ+e)
-
∑ i n l c m ( i , n ) = n ∑ i n i g c d ( i , n ) = n ∑ d ∣ n ∑ i n i [ g c d ( i , n ) = d ] d = n ∑ d ∣ n ∑ j n d j e ( g c d ( j , n d ) \sum_{i}^n lcm(i,n)=n\sum_{i}^n\frac{i}{gcd(i,n)}=n\sum_{d|n}\frac{\sum_i^ni[gcd(i,n)=d]}{d}=n\sum_{d|n}\sum_{j}^{\frac{n}{d}}je(gcd(j,\frac{n}{d}) ∑inlcm(i,n)=n∑ingcd(i,n)i=n∑d∣nd∑ini[gcd(i,n)=d]=n∑d∣n∑jdnje(gcd(j,dn)
-
∑ i n ∑ j m i j e ( g c d ( i , j ) ) = ∑ i n ∑ j m i j ∑ d ∣ i , j μ ( d ) = ∑ d μ ( d ) ∑ i = 1 n d ∑ j = 1 m d i j \sum_{i}^n\sum_{j}^mije(gcd(i,j))=\sum_{i}^n\sum_{j}^mij\sum_{d|i,j}\mu(d)=\sum_{d}\mu(d)\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}}ij ∑in∑jmije(gcd(i,j))=∑in∑jmij∑d∣i,jμ(d)=∑dμ(d)∑i=1dn∑j=1dmij
-
相同部分放到一起
-
变换枚举顺序(先枚举约数)