\(\sum_{i = 1}^{n} k \bmod i = n * k - \sum_{i = 1}^{n} \lfloor k / i \rfloor * i\)

显然,\(\lfloor k / i \rfloor\) 是最棘手的,我们要想办法简化计算。

证明单调性

  • 观察 \(\lfloor k / i \rfloor\),显然随着 \(i\) 的增大,这个式子是越来越小的。

  • 又因为有向下取整符号,所以该式子取值只能是整数。

若我们设函数 \(f(x) = \lfloor k / x \rfloor\)。则画在坐标轴中应该是从高到低一条条横线。

上图是一条 \(f(x) = \lfloor 10 / x \rfloor\) 的图像。

证明该式子最多只有 \(2\sqrt{k}\) 个取值

分段讨论:

  • 当 \(i <= \sqrt{k}\) 时,因为 \(i\) 是 \(1\) 到 \(\sqrt{k}\) 的整数,所以最多只有 \(\sqrt{k}\) 个不同的 \(\lfloor k / i \rfloor\) 值。
  • 当 \(i > \sqrt{k}\) 时,\(\lfloor k / i \rfloor <= \sqrt{k}\),又因为式子取整了,所以式子只能取\(1\) 到 \(\sqrt{k}\) 的整数,故最多也只有 \(\sqrt{k}\) 个不同的 \(\lfloor k / i \rfloor\) 值。

综上所述,\(\lfloor k / i \rfloor\) 最多只有 \(2\sqrt{k}\) 个取值


有关 当 \(i > \sqrt{k}\) 时,\(\lfloor k / i \rfloor <= \sqrt{k}\) 的证明:

由于下取整,所以 \(\lfloor k / i \rfloor * i <= k\) ①

假设 $\lfloor k / i \rfloor > \sqrt{k} $,有 \(\lfloor k / i \rfloor * i > \lfloor k / i \rfloor * \sqrt{k} > \sqrt{k} ^ 2 = k\)。②

① 与 ② 矛盾


通过以上步骤,我们可以知道这个答案由连续 \(2\sqrt{k}\) 段不同的取值组成,那么我们只需要确定每种取值是下界 \(l\) 和 上界 \(r\)。通过 \(\sum_{i = l}^{r} \lfloor k / i \rfloor * i = \sum_{i = l}^{r} \lfloor k / l \rfloor * i = \lfloor k / l \rfloor * (\sum_{i = l}^{r}i)\) 即可求得每一段对答案的贡献。\((\sum_{i = l}^{r}i)\) 可以用等差数列求和公式计算。

已知下界求上界

假设我们知道一段相同取值的下界是 \(x\),若能求出上界,我们问题便解决了。

猜想若下界是 \(x\),上界是 \(r = \lfloor k / \lfloor k / x \rfloor \rfloor\)

第一步、求证 \(\lfloor k / x \rfloor = \lfloor k / r \rfloor\)

  • 由定义式可知 \(r * \lfloor k / x \rfloor + q = k\) ③,其中 \(0 <= q < \lfloor k / x \rfloor\),所以 \(\lfloor k / r \rfloor = \lfloor\frac{r * \lfloor k / x \rfloor + q}{r}\rfloor = \lfloor k / x \rfloor + \lfloor \frac{q}{r} \rfloor >= \lfloor k / x \rfloor\)

  • \(r >= \lfloor k / (k / x ) \rfloor = x\),所以 \(\lfloor k / x \rfloor >= \lfloor k / r \rfloor\)

综上 \(\lfloor k / x \rfloor = \lfloor k / r \rfloor\)。


第二步、求证 \(\lfloor k / (r + 1) \rfloor \not = \lfloor k / x \rfloor\)

假设 \(\lfloor k / (r + 1) \rfloor = \lfloor k / x \rfloor\)

那么有 \((r + 1) * \lfloor k / x \rfloor + q' = k\),其中 \(0 <= q < r + 1\)

把式子变化一下:

$r * \lfloor k / x \rfloor + \lfloor k / x \rfloor + q' = k $ ④

③④ 联立,有:

\(\lfloor k / x \rfloor + q' < \lfloor k / x \rfloor\)

因为 \(q' >= 0\),所以该式子矛盾,故假设不成立。


通过这两步及之前的单调性,我们知道 \(\lfloor k / \lfloor k / x \rfloor \rfloor\) 一定是上界

算法

所以算法就很好设计了:

  • 设 \(l = 1\),算出上界 \(r\)。计算这段的贡献
  • 使 \(l = r + 1\),即跳到下一段计算贡献。
  • 重复知道算完 \([1, n]\) 里所有段。

\(Tips:\)

  1. 当 \(\lfloor k / l \rfloor = 0\) 的时候,显然这段以及后面(有单调性)已经没有贡献了,可以 \(break\)。(或者直接设右端点为 \(n\))
  2. 注意右端点和 \(n\) 取个 \(min\),因为 $ > n$ 没有贡献了。
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long LL;
int n, k, l, r;
LL ans;
int main() {
scanf("%d%d", &n, &k);
ans = (LL)n * k;
for (l = 1; l <= n; l = r + 1) {
if(k / l == 0) break;
r = min(k / (k / l), n);
ans -= (LL)(k / l) * (l + r) * (r - l + 1) / 2;
}
printf("%lld\n", ans);
return 0;
}

AcWing 199. 余数之和的更多相关文章

  1. AcWing 199. 余数之和 (除法分块)打卡

    给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值. 例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod ...

  2. BZOJ 1257: [CQOI2007]余数之和sum

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 3769  Solved: 1734[Submit][St ...

  3. 【BZOJ1257】【CQOI2007】余数之和sum

    Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数.例如j(5, ...

  4. 51nod1225 余数之和

    打表可以看出规律.分块求就可以了. #include<cstdio> #include<cstring> #include<cctype> #include< ...

  5. [原博客] BZOJ 1257 [CQOI2007] 余数之和

    题目链接题意: 给定n,k,求 ∑(k mod i) {1<=i<=n} 其中 n,k<=10^9. 即 k mod 1 + k mod 2 + k mod 3 + … + k mo ...

  6. bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1779  Solved: 823[Submit][Sta ...

  7. BZOJ 1257: [CQOI2007]余数之和sum( 数论 )

    n >= k 部分对答案的贡献为 k * (n - k) n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i)  = ∑  , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连 ...

  8. 1257: [CQOI2007]余数之和sum

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2001  Solved: 928[Submit][Sta ...

  9. BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4474  Solved: 2083[Submit][St ...

随机推荐

  1. 转载 Web前端开发 HTML设计 经验与技巧总结

    文章目录1.限制input 输入框只能输入纯数字.限制长度.默认显示文字2.input输入框自动获取焦点3.用CSS让背景有透明度文字不变4.a标签禁止点击5.文字两种居中对齐6.设置一个元素一直在页 ...

  2. Python_opencv库

    1.车牌检测 ''' 项目名称:opencv/cv2 车牌检测 简介: 1.训练级联表 ***.xml [跳过...] 2.用如下代码加载级联表和目标图片识别车牌 注:推荐用anconda安装open ...

  3. nacos服务注册源码解析

    1.客户端使用 compile 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:2.2.3.RELEASE' compi ...

  4. web安全原理-文件包含漏洞

    前言 起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了  拿出买的书开始从头学习总结文件包含漏洞! 一.文件包含漏洞 文件包含漏洞 文件包含函数的参数没有经过过滤或者严格的 ...

  5. 《Machine Learning in Action》—— 懂的都懂,不懂的也能懂。非线性支持向量机

    说在前面:前几天,公众号不是给大家推送了第二篇关于决策树的文章嘛.阅读过的读者应该会发现,在最后排版已经有点乱套了.真的很抱歉,也不知道咋回事,到了后期Markdown格式文件的内容就解析出现问题了, ...

  6. Guitar Pro小课堂之如何演奏刮弦

    每当我们听到吉他现场演出的时候,看到吉他手在激烈的刮弦时,都觉得很酷,非常有感染力.刮弦在我们弹吉他或编曲时,会经常用到,虽然时间很短,但会为你加分不少. 那么我们应该如何演奏刮弦呢,我们先用E5和弦 ...

  7. 吉他弹唱上手——使用节奏变化弹好chord谱

    本篇文章将向大家介绍如何改造来自网上的chord谱. 在各位日常的弹唱之中,应该会常常遇到朋友点歌的情况,如果点唱的这首歌我们听过,那我们尚可以靠以往的记忆来应付.如果这首歌我们只是曾经听到过听过,而 ...

  8. 一分钟了解 sync、fsync、fdatasync 系统调用

    目录 一.缓冲 二.延迟写的优缺点 三.sync.fsync.fdatasync 关注送书!<Netty实战>(今晚开奖) Hi,大家好!我是白日梦. 今天我要跟你分享的话题是:" ...

  9. 【原创】视频+文字:详解VBA解决数独问题

    [说在前面]: 之前,我在微信朋友圈看到一个同事发了一个状态,说的是她在家辅导孩子做作业,一个数独的题目,好像没有做出来.我看了下,我也做不出来,后来仔细想了下,花了两个多小时时间,用Python编了 ...

  10. sentinel配置

    登陆接口 QPS5,异常0.8,熔断10s 1.异地登陆同省逻辑降级security 2.可疑用户判断certification 3.是否是危险设备判断account 4.是否是自动化imei,ime ...