题面
求
[sum_{i=1}^{n}sum_{j=1}^{n}f(i)f(j)f(gcd(i,j))
]
的值,其中(nleq5 imes10^7 f(i))表示(i)的约数个数。
直接推式子,根据约数个数的定义,有
[f(gcd(i,j))=sum_{d|gcd(i,j)}1
]
这一步枚举约数,一个约数贡献答案一
然后把右边的式子继续拆开,如果一个数能整除两个数的(gcd)那么它一定也能整除这两个数,于是
[sum_{d|gcd(i,j)}1=sum_{d|i,d|j}1
]
然后原式子就化为
[sum_{i=1}^{n}sum_{j=1}^{n}f(i)f(j)sum_{d|i,d|j}1
]
发现这里(d)的选择受到(i)和(j)的限制,反过来说(d)也能限制(i)和(j)的选择,那么肯定是选限制多个的那个数去枚举,所以可以直接枚举(d),那么就有
[sum_{d=1}^{n}sum_{d|i,d|j}f(i)f(j)
]
这里枚举(i)和(j)的时候肯定不能(O(n))的枚举因子,所以换一个角度枚举倍数,得到
[sum_{d=1}^{n}sum_{x=1}^{lfloor{frac{n}d}
floor}sum_{y=1}^{lfloor{frac{n}d}
floor}f(x imes d)f(y imes d)
]
然后又发现(x)和(y)的枚举实际上是一样的,合并之后可以得到
[sum_{d=1}^{n}(sum_{x=1}^{lfloor{frac{n}d}
floor}f(x imes d))(sum_{x=1}^{lfloor{frac{n}d}
floor}f(x imes d))
]
[=sum_{d=1}^{n}(sum_{x=1}^{lfloor{frac{n}d}
floor}f(x imes d))^2
]
注意是先求和再平方
这个式子直接做的话是(O(nlogn))的,调和级数。
时间复杂度的瓶颈主要是在统计这个前缀和上边,如果能想办法优化掉它就很好了。
类似高维前缀和,可以由这样一个性质统计出来,就是对于一个数,如果它能为后边的某个数的前缀和做贡献,那么它分解质因子之后各位上的次幂一定是不会有大于那个数的,根据这个统计一下前缀和即可。