题目大意
共有
T 组数据,给定
n,m,设
d(x)=∑i∣x1,求
i=1∑nj=1∑md(ij)
数据范围
T=1(不输入),1⩽n=m(不输入)⩽109 或
1⩽n,m,T⩽50000
题解
由于两道题目有一定不同,这里考虑最大范围,但不管如何,先来证证证……
结论
d(ij)=x∣i∑y∣j∑[(x,y)=1]
证明 对于
ij,其唯一分解为
ij=d=1∏npdkd,则
d(ij)=d=1∏n(kd+1)。
考虑一个质数
p 对
d(i,j) 的贡献,设
i=k∗p∗t1,j=q∗p∗t2,则对
d(ij) 得贡献为
k+q+1 (约数个数
+1 的乘积)。
再来看一个引理
引理 设
i=k∗p∗t1,j=q∗p∗t2,则有:
x=0∑ky=0∑q[(px,py)=1]=q+k+1
证明 可以发现,当且仅当
xy=0 时,
(px,py)=1,故成立。
因此对质数
p 对
d(i,j) 的贡献的贡献为
x=0∑ky=0∑q[(px,py)=1] 。
接下来设
i=i=1∏npiki,j=i=1∏npiqi,考虑下面逐一每一个质数
pi,根据乘法原理得:
d(ij)=x1=0∑k1y1=0∑q1[(p1x1,p1y1)=1]x2=0∑k2y2=0∑q2[(p2x2,p2y2)=1]...xn=0∑knyn=0∑qn[(pnxn,pnyn)=1]
即
d(i,j)=d=1∑nxd=0∑kdyd=0∑qd[(pdxd,pdyd)=1]
令
x=i=1∏npiki,y=i=1∏npiki,则答案为
x∣i∑y∣j∑[(x,y)=1]
代入题目,得:
i=1∑nj=1∑md(ij)=i=1∑nj=1∑mx∣i∑y∣j∑[(x,y)=1]=i=1∑nj=1∑mx∣i∑y∣j∑d∣(x,y)∑μ(d)
各回各家,各找各妈,好好理解,实在不行用C++证明法。
原式=d=1∑min(n,m)μ(d)(d∣x∑x⩽nx∣i∑i⩽n1)(d∣y∑y⩽my∣j∑i⩽m1)=d=1∑min(n,m)μ(d)(d∣x∑x⩽n⌊xn⌋)(d∣y∑y⩽m⌊ym⌋)=d=1∑min(n,m)μ(d)(x=1∑⌊dn⌋⌊dxn⌋)(y=1∑⌊dm⌋⌊dym⌋)=d=1∑min(n,m)μ(d)(x=1∑⌊dn⌋⌊x⌊dn⌋⌋)(y=1∑⌊dm⌋⌊y⌊dm⌋⌋)
Luogu
Θ(nn
)预处理出
f(x)=∑i=1n⌊in⌋,线筛出
μ 即可。
BZOJ
BZOJ 要求设计非线性算法,因而
μ 的前缀和需要用杜教筛求出,而且不能再直接
Θ(nn
) 预处理,必须追求更低的时间复杂度。
由于
n=m,有:
d=1∑min(n,m)μ(d)(x=1∑⌊dn⌋⌊x⌊dn⌋⌋)(y=1∑⌊dm⌋⌊y⌊dm⌋⌋)=d=1∑min(n,m)μ(d)(x=1∑⌊dn⌋⌊x⌊dn⌋⌋)2
右边那堆可以在除法分块的同时完成。