版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hzj1054689699/article/details/81914478
Description
求
∑i=1A∑j=1B∑k=1C[(i,j)=1 and (j,k)=1 and (i,k)=1]
A,B,C<=50000
Solution
考虑枚举一个,设函数
f(i)=∑j=1B∑k=1C[(i,j)=1][(j,k)=1][(i,k)=1]
把(j,k)=1的限制用莫比乌斯反演消掉
=∑d=1min(B,C)μ(d)∑j=1⌊Bd⌋∑k=1⌊Cd⌋[(i,jd)=1][(i,kd=1)]
=∑d=1min(B,C)μ(d)[(i,d)=1]∑j=1⌊Bd⌋∑k=1⌊Cd⌋[(i,j)=1][(i,k=1)]
发现后面两个求和互不干扰,只和d,i有关,那么我们可以分开来算,最后再乘积
=∑d=1min(B,C)μ(d)[(i,d)=1]⎛⎝⎜∑j=1⌊Bd⌋[(i,j)=1]⎞⎠⎟⎛⎝⎜∑k=1⌊Cd⌋[(i,k=1)]⎞⎠⎟
那么对d分块后,问题转化成快速求两个函数
G(i,n)=∑j=1n[(i,j)=1]
H(i,n)=∑j=1n[(i,j)=1]μ(j)
考虑G
我们发现最大公因数只与质因子种类有关,因此我们不妨直接假定
μ2(i)=1
(即每个质因子指数都为1),如果存在大于1的质因子它的函数值是和=1的情况相同的,直接记一下就好了。
那我们随便找到i的一个质因子p
大力推式子
G(i,n)=∑j=1n[(i,j)=1]
=∑j=1n[(p,j)=1][(i/p,j)=1]
=∑j=1n(1−[p|j])[(i/p,j)=1]
=∑j=1n[(i/p,j)=1]−∑j=1⌊np⌋[(i/p,pj)=1]
又因为
μ2(i)=1
,因此
(i/p,p)
恒为1,那么
=∑j=1n[(i/p,j)=1]−∑j=1⌊np⌋[(i/p,j)=1]
=G(i/p,n)−G(i/p,⌊np⌋)
H是类似的
H(i,n)=∑j=1n[(i,j)=1]μ(j)
=∑j=1n[(p,j)=1][(i/p,j)=1]μ(j)
=∑j=1n(1−[p|j])[(i/p,j)=1]μ(j)
=∑j=1n[(i/p,j)=1]μ(j)−∑j=1⌊np⌋[(i/p,pj)=1]μ(pj)
我们知道p与j不互质时
μ(pj)=0
那么
=∑j=1n[(i/p,j)=1]μ(j)−∑j=1⌊np⌋[(i/p,j)=1][(p,j)=1]μ(p)μ(j)
=H(i/p,n)−μ(p)H(i,⌊np⌋)
=H(i/p,n)+H(i,⌊np⌋)
第二维实际上只用记对B,C分块后的剩下的根号个位置即可。
注意采用寻址优化(枚举顺序,数组顺序)
Code
因为博主比较懒,没有去写。。