• 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
  • 相关阅读:
    windows live writer 测试
    2011518资金净流入
    做人真善美,做事拖后腿
    今日盘面分析2011517
    近期国际版概念(5月19日益盟消息回顾)
    linux 系统应用程序桌面图标显示及进程自启动
    C#中发送邮件(以ASP.NET为例)
    Jquery使用$.Post方法,本地可以,服务器错误的处理方法...
    Silverlight中使用动画的技巧
    Silverlight之Easing
  • 原文地址:https://www.cnblogs.com/anyixing-fly/p/13662721.html
Copyright © 2020-2023  润新知