AcWing 199. 余数之和
\(\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:\)
- 当 \(\lfloor k / l \rfloor = 0\) 的时候,显然这段以及后面(有单调性)已经没有贡献了,可以 \(break\)。(或者直接设右端点为 \(n\))
- 注意右端点和 \(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. 余数之和的更多相关文章
- 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 ...
- BZOJ 1257: [CQOI2007]余数之和sum
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 3769 Solved: 1734[Submit][St ...
- 【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, ...
- 51nod1225 余数之和
打表可以看出规律.分块求就可以了. #include<cstdio> #include<cstring> #include<cctype> #include< ...
- [原博客] 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 ...
- bzoj 1257: [CQOI2007]余数之和sum 数学 && 枚举
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 1779 Solved: 823[Submit][Sta ...
- BZOJ 1257: [CQOI2007]余数之和sum( 数论 )
n >= k 部分对答案的贡献为 k * (n - k) n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i) = ∑ , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连 ...
- 1257: [CQOI2007]余数之和sum
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 2001 Solved: 928[Submit][Sta ...
- BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 4474 Solved: 2083[Submit][St ...
随机推荐
- Ubuntu18.04上安装CUDA_10.1(nvidia-driver)和cuDNN_7.6.5
本文是在Ubuntu18.04.5服务器上安装CUDA_10.1(nvidia-driver455)和cuDNN_7.6.5, Ubuntu 18.04.5 CUDA_10.1 (nvidia-dri ...
- Android10_原理机制系列_AMS之AMS的启动
概述 该篇基于AndroidQ,主要介绍系统启动中的 AMS(ActivityManagerService)的启动过程. AMS对四大组件(AndroidQ将activity移到了ActivityTa ...
- Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)
漏洞原理 Tomcat配置了两个Connecto,它们分别是HTTP和AJP. HTTP默认端口为8080,处理http请求:AJP默认端口8009,用于处理 AJP 协议的请求. AJP比http更 ...
- 【网鼎杯2020朱雀组】Web WriteUp
nmap nmap语法,很简单. 127.0.0.1' -iL /flag -oN vege.txt ' phpweb 打开,抓包,发现可以传递函数和其参数 试了一下很多函数都被过滤了,不能执行系统命 ...
- python 定时任务框架apscheduler
文章目录 安装 基本概念介绍 调度器的工作流程 实例1 -间隔性任务 实例2 - cron 任务 配置调度器 方法一 方法二 方法三: 启动调度器 方法一:使用默认的作业存储器: 方法二:使用数据库作 ...
- 「LOJ 538」「LibreOJ NOIP Round #1」数列递推
description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从\(0\)开始,无限长的整数列\({a_ ...
- 【VUE】4.配置axios发起请求
1.配置axios 1. 前端请求后端接口进行数据交互的时候,需要配置axios 2. 导入axios包, main.js import axios from 'axios' 3. 挂载到原型配置上, ...
- ceph 集群快速部署
1.三台Centos7的主机 [root@ceph-1 ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 2.主机 ...
- Java基础教程——泛型
泛型 Generics:泛型,愿意指"无商标的". 泛型,可以理解为"宽泛的数据类型",就是将类型由原来的具体的类型泛化. 泛型在建立对象时不指定类中属性的具体 ...
- 使用zabbix监控Jenkins
一.监控架构图 二.实现思路 在 Jenkins 上安装 Metrics 插件,使 Jenkins 暴露 metrics api: 编写python代码从api抓取数据,并将数据解析为zabbix可以 ...