• 题解 P3312 【[SDOI2014]数表】


    数表

    [ans=sum_{i=1}^{n}sum_{j=1}^{m}[ageqsum_{d|gcd(i,j)}d] imessum_{d|gcd(i,j)}d ]

    我们假设

    [G(n,m)=sum_{d|gcd(n,m)}d ]

    [n leq m ]

    [egin{aligned} G(n,m) & = sum_{d|gcd(n,m)}d \ & = sum_{d=1}^{n}d imes[d|gcd(n,m)] \ & = sum_{d=1}^nd imes[mn=leftlfloordfrac{nm}{d^2} ight floor imes d^2] end{aligned} ]

    这个思路有点难走,那我们换个思路

    [ans=(sum_{i=1}^nsum_{j=1}^msum_{d|gcd(i,j)}d)-(sum_{i=1}^nsum_{j=1}^m[a<sum_{d|gcd(i,j)}d] imessum_{d|gcd(i,j)}d) ]

    我们设前面的式子为sum(n,m),则

    [egin{aligned} sum(n,m) & =sum_{i=1}^nsum_{j=1}^msum_{d|gcd(i,j)}d \ & =sum_{d=1}^nd imes leftlfloordfrac{n}{d} ight floor imesleftlfloordfrac{m}{d} ight floor end{aligned} ]

    这个可以用数论分块

    然后我们发现其实后面的式子和上面没有用减法原理的式子一样,所以失败


    这个时候,我们发现我们最开始枚举的东西就是除数函数!

    其实我没有发现,是看题解才知道的

    所以我们可以写出sum(n,m)的另一个版本

    [egin{aligned} sum(n,m) & = sum_{i=1}^nsum_{j=1}^msigma(gcd(i,j)) \ & = sum_{t=1}^{n}sigma(t)sum_{i=1}^{leftlfloordfrac{n}{t} ight floor}sum_{j=1}^{leftlfloordfrac{m}{t} ight floor}[gcd(i,j)=1] \ & = sum_{t=1}^{n}sigma(t)sum_{i=1}^{leftlfloordfrac{n}{t} ight floor}sum_{j=1}^{leftlfloordfrac{m}{t} ight floor}sum_{d|gcd(i,j)}mu(d) \ & = sum_{t=1}^{n}sigma(t)sum_{d=1}^{leftlfloordfrac{n}{t} ight floor}mu(d)leftlfloordfrac{n}{dt} ight floorleftlfloordfrac{m}{dt} ight floor \ & =sum_{T=1}^{n}leftlfloordfrac{n}{T} ight floorleftlfloordfrac{m}{T} ight floorsum_{d|T}sigma(d)mu(frac{T}{d}) end{aligned} ]

    此时,前面的求和可以分块(O(n + m)),后面的是个积性函数,可以预处理,然后就是O(1)

    但是,不是每个东西都对答案有贡献,所以我们要排除掉没有贡献的.

    然后就需要维护答案,想到维护这个词,在看一下式子,

    [ ext{单点修改,区间查询} ]

    这不就是树状数组吗?

    我们可以维护一个树状数组来存储合法的点,然后取出进行统计就可以了

  • 相关阅读:
    利用print2flashsetup.exe文档转swf
    Linux 脚本内容指定用户执行
    第一讲:网络协议概述
    第三讲:ifconfig:最熟悉又陌生的命令行
    第2讲 | 网络分层的真实含义是什么?
    Fiddler -工具使用介绍(附:拦截请求并修改返回数据)(转)
    Fiddler 抓包工具总结(转)
    网络抓包wireshark(转)
    Axure RP 授权码
    第6堂视频课:看到词句就会读-下
  • 原文地址:https://www.cnblogs.com/starseven/p/13560251.html
Copyright © 2020-2023  润新知