zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    vscode中执行gulp task的简便方法
    5G即将到来,你还会购买4G手机吗?
    小屏幕手机汇总
    NoSQL数据库的分布式算法详解
    如何在网页界面设计中正确的留出空白空间?
    iconfont的三种使用方式
    MySQL修改密码方法汇总
    Docker镜像与容器
    微观经济学
    经营的原点 书评
  • 原文地址:https://www.cnblogs.com/anyixing-fly/p/13662721.html
Copyright © 2011-2022 走看看