题目描述

给出正整数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 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7。

输入格式

输入仅一行,包含两个整数n, k。

输出格式

输出仅一行,即j(n, k)。

数据范围

1≤n,k≤1e9

输入样例

5 3

输出样例

7

思路:

这题,纯数学题。
已知 k m o d i = k − ⌊ k / i ⌋ ∗ i k \ mod\ i = k - \lfloor k / i \rfloor * i k mod i=k−⌊k/i⌋∗i
所以: ∑ i = 1 n k m o d i = n ∗ k − ∑ i = 1 n ⌊ k / i ⌋ ∗ i \sum_{i=1}^n{k\ mod\ i} = n * k - \sum_{i=1}^n{\lfloor k / i \rfloor * i} i=1∑n​k mod i=n∗k−i=1∑n​⌊k/i⌋∗i
由此可以看出,我们必须将 ∑ i = 1 n ⌊ k / i ⌋ ∗ i {\sum_{i=1}^n\lfloor k / i \rfloor * i} ∑i=1n​⌊k/i⌋∗i 进行简化计算。
⌊ k / i ⌋ \lfloor k / i \rfloor ⌊k/i⌋ 随着 i i i 的递增,是一个递减的趋势,也就是一个单调递减的性质。
对于任意的整数 l ∈ [ 1 , k ] l\in[1, k] l∈[1,k],设 r = ⌊ k / ⌊ k / l ⌋ ⌋ r=\lfloor k/\lfloor k/l\rfloor\rfloor r=⌊k/⌊k/l⌋⌋
又 ⌊ k / l ⌋ ≤ ( k / l ) \lfloor k / l\rfloor\leq(k/l) ⌊k/l⌋≤(k/l)
显然有 r ≥ ⌊ k / ( k / l ) ⌋ = x r\geq\lfloor k/(k/l)\rfloor=x r≥⌊k/(k/l)⌋=x,所以, ⌊ k / r ⌋ ≤ ⌊ k / l ⌋ \lfloor k/r\rfloor\leq\lfloor k/l\rfloor ⌊k/r⌋≤⌊k/l⌋。
又因为, ⌊ k / r ⌋ ≥ ⌊ k / ( k / ⌊ k / l ⌋ ) ⌋ = ⌊ k / k ∗ ⌊ k / l ⌋ ⌋ = ⌊ k / l ⌋ \lfloor k / r\rfloor\geq\lfloor k/(k/\lfloor k/l\rfloor)\rfloor=\lfloor k/k*\lfloor k/l\rfloor\rfloor=\lfloor k/l\rfloor ⌊k/r⌋≥⌊k/(k/⌊k/l⌋)⌋=⌊k/k∗⌊k/l⌋⌋=⌊k/l⌋
所以: ⌊ k / r ⌋ = ⌊ k / l ⌋ \lfloor k / r\rfloor=\lfloor k/l\rfloor ⌊k/r⌋=⌊k/l⌋。
并且对于任意的 i ∈ [ l , ⌊ k / ⌊ k / l ⌋ ⌋ ] i\in[l, \lfloor k/\lfloor k/l\rfloor\rfloor] i∈[l,⌊k/⌊k/l⌋⌋], ⌊ k / i ⌋ \lfloor k/i\rfloor ⌊k/i⌋的值都相等,图像为一段平行于x轴的线段。这样,我们就可以将循环的范围进行缩小,优化了效率。

接下来证明一下循环的范围。

∀ i ∈ [ 1 , k ] \forall i\in[1,k] ∀i∈[1,k]

  1. 当 i ≤ k i\leq\sqrt k i≤k ​ 时, i i i 为 1 ⇒ k 1\Rightarrow \sqrt k 1⇒k ​ 的整数,所以 ⌊ k / i ⌋ \lfloor k/i\rfloor ⌊k/i⌋最多只有 k \sqrt k k ​个不同的值。
  2. 当 i > k i>\sqrt k i>k ​ 时, ⌊ k / i ⌋ < k \lfloor k/i\rfloor<\sqrt k ⌊k/i⌋<k ​,又因为 ⌊ k / i ⌋ \lfloor k/i\rfloor ⌊k/i⌋是向下取整,故 ⌊ k / i ⌋ \lfloor k/i\rfloor ⌊k/i⌋也最多只有 k \sqrt k k ​ 个不同的取值。

所以, ⌊ k / i ⌋ \lfloor k/i\rfloor ⌊k/i⌋至多只有 2 k 2\sqrt k 2k ​ 个不同的值。
综上所述,对于 i = [ 1 , k ] i=[1,k] i=[1,k], ⌊ k / i ⌋ \lfloor k/i\rfloor ⌊k/i⌋由不超过 2 k 2\sqrt k 2k ​不同的值段组成,每一段的值都相等。

所以对于每一段 ∑ i = l r ⌊ k / i ⌋ ∗ i {\sum_{i=l}^r\lfloor k / i \rfloor * i} ∑i=lr​⌊k/i⌋∗i 可以简化成 ⌊ k / l ⌋ ∗ ∑ i = l r i \lfloor k / l\rfloor*\sum_{i=l}^ri ⌊k/l⌋∗∑i=lr​i。
而 ∑ i = l r i \sum_{i=l}^ri ∑i=lr​i 是一个等差数列求和,代代求和公式就可求出。

算法设计:
  1. 先让 l = 1 l=1 l=1,再计算出求和的上界 r r r,最后代公式计算整段的值
  2. 更新每段的段首,即 l = r + 1 l=r+1 l=r+1
  3. 重复1、2步,直到取完所有的可选段,即当 k / l k/l k/l 为零的时候,上界就取完了。

注意数据范围,可能会炸int,所以索性全开long long 了。
注意一下上界只能取到右端点n,如果大于n,这段值为零是没有贡献的,所以得判断一下 ⌊ k / ⌊ k / l ⌋ ⌋ \lfloor k /\lfloor k / l\rfloor\rfloor ⌊k/⌊k/l⌋⌋ 与 n n n 的大小关系,上界取min

代码:
#include <iostream>
#include <algorithm>using namespace std;typedef long long LL;LL n, k, res;int main()
{cin >> n >> k;res = n * k;for(int l = 1, r; l <= n; l = r + 1){//判断上界是否为0,如果为0,则说明取到无值贡献的段了,可以直接break掉,也可以让r等于右端点n。r = k / l ? min(k/(k/l), n) : n;//(l + r) * (r - l + 1) / 2 是等差数列求和res -= (k/l) * (l + r) * (r - l + 1) / 2;}cout << res << endl;return 0;
}

余数之和(数论、数学题)相关推荐

  1. bzoj 1257: [CQOI2007]余数之和sum 数论

    1257: [CQOI2007]余数之和sum Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnlin ...

  2. 数论、关于余数之和的浅解

    求余数之和问题 就相当于一个n和k,将k对1~n的数分别求余数,然后求出来和是多少,其表达公式如j(n,k)=k%1+k%2+k%3+-+k%n. 单单暴力的话,时间上非常浪费,所以这个时候引用数论里 ...

  3. BZOJ 1257 [CQOI2007]余数之和sum 题解

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1138  Solved: 509 [Submit][S ...

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

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

  5. bzoj1257: [CQOI2007]余数之和sum

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 2787  Solved: 1278 [Submit][ ...

  6. bzoj 1257: [CQOI2007]余数之和sum

    1257: [CQOI2007]余数之和sum Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 4462  Solved: 2078 [Submit][ ...

  7. YBT高效进阶 6.2.5 余数之和

    YBT高效进阶 6.2.5 余数之和 思路 (n,k)(n,k)(n,k) =∑i=1nkmodi=\sum_{i=1}^nk\bmod i=∑i=1n​kmodi =∑i=1nk−⌊ki⌋=\sum ...

  8. 数学知识——余数之和

    传送门:199. 余数之和 - AcWing题库 思路:如下 代码: #include<iostream> #include<cstring> #include<algo ...

  9. [bzoj] 1257 余数之和sum || 数论

    原题 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值,其中k mod i表示k除以i的余数. \(\sum^n_{i=1} ...

最新文章

  1. 哪些“双一流”更得华为偏爱?这所高校人数远超清北华五
  2. [Leedcode][JAVA][第152题][乘积最大子数组][动态规划]
  3. 转:一个Sqrt函数引发的血案
  4. 使 32 位程序使用大于 2GB 的内存
  5. solr 配置多个entity_solr建索引优化
  6. 用PPT直接修改主集成模板,并保存为pps格式,即可现场展示应用.
  7. pytorch学习6:norm函数--范数的理解和计算
  8. 【简单的四足机器人制作(基于STC15/LPC845)】
  9. 新手如何做好网络营销
  10. 在书的侧面(包括书口、书顶<上切口>、书根<下切口>)写的字如何去除
  11. Lerx开源网站内容管理CMS系统源码
  12. 微信小程序使用正则过滤电话号码
  13. 计算机时钟同步的原理,华为以太网时钟同步原理介绍(二)
  14. 获取select选中的值php,js如何获取select标签选中的值
  15. 移植linux内核串口配置,uClinux内核的移植 - bootloader对uClinux的S3C44B0移植
  16. Stencil计算GPU性能建模
  17. is not backed by gradle android,Module … is not backed by gradle
  18. 世界上最简单的会计书(利润表)
  19. 数据库实验报告 创建学生关系数据表、课程表、选课表 SQL Kingbase
  20. 互联网大咖看了都忍不住点赞的电脑配置指南【电脑小白必备】【十年私藏公开分享】

热门文章

  1. 后缀表达式求值-C++实现
  2. 独家对话V神! 质疑之下的以太坊路在何方?
  3. vue 生成带背景图片,文字图片自定义二维码图片
  4. 数据结构之图论算法(四)—— 拓扑算法
  5. Java序列化有什么作用
  6. VC下win32钩子
  7. 定位关键点ORB_create()函数解析
  8. 用Cocos2D开发的iPhone游戏的教程
  9. COCI 2015/2016 PROKLETNIK(单调栈+线段树)
  10. 浅析C++中的打开文件、保存文件(OPENFILENAME)