zoukankan      html  css  js  c++  java
  • 【SDOI 2014】数表

     题意

      https://loj.ac/problem/2193

     题解

      ​显然就是求 $sumlimits_{i=1}^{n} sumlimits_{j=1}^{m} sigma_1(gcd{(i,j)}) [gcd(i,j)le a]$($sigma_1(x)$ 表示求 $x$ 的所有约数之和),看到 $gcd$ 就知道是莫比乌斯反演基础题吧

      如果不考虑 $a$ 的限制,这就是推一遍莫反的模板题,那先不考虑,则原式变为$$sumlimits_{i=1}^{n} sumlimits_{j=1}^{m} sigma_1(gcd{(i,j)})$$

      根据套路枚举约数 $$sumlimits_{k=1}^{n} sumlimits_{i=1}^{n} sumlimits_{j=1}^{m} sigma_1(k) [gcd(i,j)=k]$$

      显然当 $i|k, j|k$ 时,$gcd(i,j)$ 才有可能为 $k$。所以简化式子得 $$sumlimits_{k=1}^{n} sumlimits_{i=1}^{lfloorfrac{n}{k} floor} sumlimits_{j=1}^{lfloorfrac{m}{k} floor} sigma_1(k) [gcd(i,j)=1]$$

      把 $sigma_1(k)$ 挪到前面,并用经典公式 $sumlimits_{d|n} mu(d) = [n=1]$ 对 $[gcd(i,j)=1]$ 反演 $$sumlimits_{k=1}^{n} sigma_1(k)sumlimits_{i=1}^{lfloorfrac{n}{k} floor} sumlimits_{j=1}^{lfloorfrac{m}{k} floor} sumlimits_{d|gcd{(i,j)}} mu(d)$$

      $$sumlimits_{k=1}^{n} sigma_1(k)sumlimits_{i=1}^{lfloorfrac{n}{k} floor} sumlimits_{j=1}^{lfloorfrac{m}{k} floor} sumlimits_{d|i, d|j} mu(d)$$

      根据套路,把 $d$ 挪到前面并改成枚举 $x$。由于限制 $d|i, d|j$,只有 $i$ 和 $j$ 都是 $d$ 的倍数时才会累加一个 $mu(d)$。所以对于一个 $d$,$mu(d)$ 会被累加 $lfloorfrac{n}{kd} floor lfloorfrac{m}{kd} floor$ 次(易证 $lfloorfrac{lfloor frac{x}{y} floor}{z} floor = lfloorfrac{frac{x}{y}}{z} floor$)。故式子转化为 $$sumlimits_{k=1}^{n}  sigma_1(k) sumlimits_{d=1}^{n} mu(d) lfloorfrac{n}{kd} floor lfloorfrac{m}{kd} floor$$

    ​  令 $nle m$,则显然当 $dgt lfloor frac{n}{k} floor$ 时,$lfloor frac{n}{dk} floor=0$。所以可以更改 $d$ 的上界 $$sumlimits_{k=1}^{n}  sigma_1(k) sumlimits_{d=1}^{lfloor frac{n}{k} floor} mu(d) lfloorfrac{n}{kd} floor lfloorfrac{m}{kd} floor$$

    ​  根据套路,令 $T=kd$,而把 $ sumlimits_{d=1}^{lfloor frac{n}{k} floor}$ 乘以 $k$ 就变成了 $T$ 的枚举式,然后我们会发现 $T$ 的枚举值依次是 $k,2k,3k,...,lfloor frac{n}{k} floor imes k$,也就是枚举一组 $k、T$ 要满足 $T$ 是 $k$ 的倍数。显然可以先枚举 $T$,然后枚举 $k$,要求 $k$ 是 $T$ 的约数。于是式子最终转化为 $$sumlimits_{T=1}^{n} lfloorfrac{n}{T} floor lfloorfrac{m}{T} floor sumlimits_{k|T} sigma_1(k) mu(frac{T}{k}) $$

      如果没有 $a$ 的限制,这道题到此就做完了,整除分块回答询问即可

      有 $a$ 的限制的话我们就考虑离线排序回答,这样有机会使总时间复杂度仍然只是扫一遍

      我们设 $g(T) = sumlimits_{k|T} sigma_1(k) mu(frac{T}{k})$,显然当 $sigma_1(k)le a$ 时,才会对 $g(T)$ 产生贡献

      于是将询问按 $a$ 从小到大排序后扫一遍,$a$ 变大会使得一些 $sigma_1(a)$ 对 $g(T)$ 产生贡献,我们就用枚举倍数的方法找到所有的 $T$,然后因为我们要动态修改 $g(T)$ 的值,还要区间询问,所以写一个常数小的树状数组即可

      处理完新产生的贡献之后回答这组询问即可

      最坏情况下所有的 $sigma_1(d)$ 都能产生贡献。枚举所有倍数 $T$ 的复杂度为 $sumlimits_{i=1}^{n} frac{n}{i}le nlog_2{n}$,因为考虑 $frac{n}{1}+frac{n}{2}+frac{n}{3}+...+frac{n}{n}$ 的值(这就是枚举的量),它显然小于 $frac{n}{1}+frac{n}{2}^2+frac{n}{4}^4+frac{n}{8}^8+...+frac{n}{lfloorlog_2{n} floor}^{lfloorlog_2{n} floor} = nlog_2{n}$(这就是分治的过层,共 $log_2$ 层,每层 $n$ 个点,所以共 $nlog_2{n}$ 个点),所以简单得证

      对于每个枚举的倍数 $T$,更新 $g(T)$ 的时间复杂度为 $log{n}$,所以修改部分的总复杂度是 $O(nlog^2{n})$

      每次询问需要整除分块,查询区间和的复杂度为 $O(log{n})$,所以总复杂度为 $O(nlog^2{n} + qsqrt{n}log{n})$

      取模的话,如果要求答案膜 $p$,你可以一直膜 $kp(k∈Z)$,输出时再膜 $p$。所以用 unsigned int 自然溢出即可,最后输出答案时膜 $2^{31}$。

       code

  • 相关阅读:
    Insert Buffering
    B-Tree vs LSM-tree
    MySQL 5.6 死锁演示 及 日志分析
    MySQL索引
    InnoDB的三个关键特性
    MySQL如何优化GROUP BY :松散索引扫描 VS 紧凑索引扫描
    MySql 自适应哈希索引
    母牛的故事
    简单的java程序
    一些变量的比较
  • 原文地址:https://www.cnblogs.com/scx2015noip-as-php/p/luogu3312.html
Copyright © 2011-2022 走看看