T1
题面
求
\[\sum_{i=1}^{n}\sum_{j=1}^{n}f(i)f(j)f(gcd(i,j))
\]
的值,其中\(n\leq5\times10^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}\rfloor}\sum_{y=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d)f(y\times d)
\]
然后又发现\(x\)和\(y\)的枚举实际上是一样的,合并之后可以得到
\[\sum_{d=1}^{n}(\sum_{x=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d))(\sum_{x=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d))
\]
\[=\sum_{d=1}^{n}(\sum_{x=1}^{\lfloor{\frac{n}d}\rfloor}f(x\times d))^2
\]
注意是先求和再平方
这个式子直接做的话是\(O(nlogn)\)的,调和级数。
时间复杂度的瓶颈主要是在统计这个前缀和上边,如果能想办法优化掉它就很好了。
类似高维前缀和,可以由这样一个性质统计出来,就是对于一个数,如果它能为后边的某个数的前缀和做贡献,那么它分解质因子之后各位上的次幂一定是不会有大于那个数的,根据这个统计一下前缀和即可。
int - > long long
0 - > 100