• T1


    题面

    [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))的,调和级数。

    时间复杂度的瓶颈主要是在统计这个前缀和上边,如果能想办法优化掉它就很好了。

    类似高维前缀和,可以由这样一个性质统计出来,就是对于一个数,如果它能为后边的某个数的前缀和做贡献,那么它分解质因子之后各位上的次幂一定是不会有大于那个数的,根据这个统计一下前缀和即可。

    int - > long long 0 - > 100
  • 相关阅读:
    单调栈模板
    Yet Another Broken Keyboard[双指针]
    经典递归集合
    [未完成]ECRound 80
    #614 C. NEKO's Maze Game[简易DFS,0|1转换]
    等差数列异或和模板
    线段树基础题
    前缀和&差分
    优先队列
    st表模板
  • 原文地址:https://www.cnblogs.com/anyixing-fly/p/13662721.html
Copyright © 2020-2023  润新知