[航海协会]求和
Posted StaroForgin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[航海协会]求和相关的知识,希望对你有一定的参考价值。
求和
题目概述
题解
既然是数学题,那我们就先来化化式子。
显然,看到
gcd
(
i
,
j
)
\\gcd(i,j)
gcd(i,j),那我们不妨枚举这个最大公因数是多少,再看看有多少对数它们的
gcd
\\gcd
gcd是这个。
有,
A
n
s
=
∑
d
=
1
n
(
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
i
,
j
)
=
d
]
)
(
∑
i
=
1
K
f
i
(
d
)
)
Ans=\\sum_d=1^n(\\sum_i=1^n\\sum_j=1^n [gcd(i,j)=d])(\\sum_i=1^Kf_i(d))
Ans=d=1∑n(i=1∑nj=1∑n[gcd(i,j)=d])(i=1∑Kfi(d))对于
f
i
(
x
)
f_i(x)
fi(x)这一项,显然是当所有质因子的次数都不超过
i
i
i的时候为
(
−
1
)
d
(
x
)
(-1)^d(x)
(−1)d(x),其它时候都为
0
0
0。
而这有显然是一个积性函数,我们可以很容易地用筛子筛出来。
所以我们主要考虑的是前面这个
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
i
,
j
)
=
d
]
\\sum_i=1^n\\sum_j=1^n[gcd(i,j)=d]
∑i=1n∑j=1n[gcd(i,j)=d]怎么算。
这主要有两种方法,一种是大家都很熟悉的莫比乌斯反演,直接枚举这个,进行容斥,
∑
d
∣
t
μ
(
t
d
)
⌊
n
t
⌋
2
=
∑
i
=
1
⌊
n
d
⌋
μ
(
i
)
⌊
⌊
n
d
⌋
i
⌋
\\sum_d|t\\mu(\\fractd)\\lfloor\\fracnt\\rfloor^2=\\sum_i=1^\\lfloor\\fracnd\\rfloor\\mu(i)\\lfloor\\frac\\lfloor\\fracnd\\rfloori\\rfloor
∑d∣tμ(dt)⌊tn⌋2=∑i=1⌊dn⌋μ(i)⌊i⌊dn⌋⌋。
我们定义
h
(
x
)
=
∑
i
=
1
x
μ
(
i
)
⌊
x
i
⌋
2
h(x)=\\sum_i=1^x\\mu(i)\\lfloor\\fracxi\\rfloor^2
h(x)=∑i=1xμ(i)⌊ix⌋2,则
A
n
s
=
∑
d
=
1
n
h
(
⌊
n
d
⌋
)
(
∑
i
=
1
K
f
i
(
d
)
)
Ans=\\sum_d=1^nh(\\lfloor\\fracnd\\rfloor)(\\sum_i=1^Kf_i(d))
Ans=∑d=1nh(⌊dn⌋)(∑i=1Kfi(d))。
显然,前面的
h
(
x
)
h(x)
h(x)是可以数论分块
O
(
x
)
O\\left(\\sqrtx\\right)
O(x)计算,后面有可以整除分块按
n
d
\\fracnd
dn计算。
后面的
f
i
(
d
)
f_i(d)
fi(d)可以
min
25
\\min25
min25筛,按
⌊
n
d
⌋
\\lfloor\\fracnd\\rfloor
⌊dn⌋位置计算前缀和,然后我们就得到了一个
O
(
n
1
−
ϵ
)
O\\left(n^1-\\epsilon\\right)
O(n1−ϵ)的亚线性算法。
然后吗?你就
T
T
T了。
好的,这也就是说我们得换一种方法计算我们的
h
(
⌊
n
d
⌋
)
h(\\lfloor\\fracnd\\rfloor)
h(⌊dn⌋),同样的思路,还是计算有多少对在
[
1
,
n
d
]
[1,\\fracnd]
[1,dn]以内的数对互质,这不是可以欧拉函数吗?
显然,
h
(
x
)
=
2
(
∑
i
=
1
x
ϕ
(
x
)
)
−
1
h(x)=2(\\sum_i=1^x\\phi(x))-1
h(x)=2(∑i=1xϕ(x))−1,之间枚举数对内较大一个数是那个不就行了吗,注意减去重复的
(
1
,
1
)
(1,1)
(1,1)。
这
ϕ
(
x
)
\\phi(x)
ϕ(x)不也是积性函数吗?我们这个前缀和可以与我们的
f
i
(
x
)
f_i(x)
fi(x)一起计算了。
ϕ
(
x
)
\\phi(x)
ϕ(x)的计算就是经典的
min
25
\\min25
min25筛问题了,先计算质数和与质数个数,减去后就得到质数处上的位置,再把其他质因子加回去即可。
至于
f
i
(
x
)
f_i(x)
fi(x)的计算,是与
μ
(
x
)
\\mu(x)
μ(x)的计算类似的你,你只需要在意把质数加回去时每个质数的次项不超过
i
i
i即可。
时间复杂度
O
(
K
n
3
4
ln
n
)
O\\left(\\fracKn^\\frac34\\ln n\\right)
O(lnnKn43)。
注意
f
f
f数组维度的顺序,这会严重地影响常数,就跟矩阵乘法一样。
源码
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
typedef unsigned int uint;
#define MAXN 200005
#define pb push_back
#define mkpr make_pair
[航海协会]万灵药