CQOI2007 余数之和
Time Limit: 5 Sec Memory Limit: 128 MB
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, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7
Input
输入仅一行,包含两个整数n, k。
1<=n ,k<=10^9
Output
输出仅一行,即j(n, k)。
Sample Input
5 3
Sample Output
7
##简要题解
我们可以把原式数学化一下:求$\sum \limits_^n k \mod i$。
我们可以发现
\begin{align*}
\text{原式}&=\sum \limits_{i=1}^n k \mod i\\
&=\sum \limits_{i=1}^n k- \lfloor \frac ki \rfloor \cdot i\\
&=nk - \sum \limits_{i=1}^n \lfloor \frac ki \rfloor \cdot i
\end{align*}
\]
显然,只要$\lfloor \frac ki \rfloor$的值在一段段i的范围内是一样的。我们的任务就是要求出每一段这样的范围。我们令$f(x)=\lfloor \frac kx \rfloor \qquad g(x)=\lfloor \frac k{\lfloor \frac kx \rfloor} \rfloor$,那么其实直觉就可以告诉我们$g(x)\(就可以表示f值=\)\lfloor \frac kx \rfloor$的最大的数。然而数学毕竟是一门严谨的科学,我们可能需要来证明一下。
显然$\lfloor \frac kx \rfloor \leq \frac kx$,那么$g(x)=\lfloor \frac k{\lfloor \frac kx \rfloor} \rfloor \geq \lfloor \frac k{\frac kx } \rfloor = x \text{即} g(x) \geq x$。所以有$\lfloor \frac k{g(x)} \rfloor \leq \lfloor \frac kx \rfloor$。
同时,\(\lfloor \frac k{g(x)} \rfloor = \lfloor \frac k{\lfloor \frac k{\lfloor \frac kx \rfloor} \rfloor} \rfloor \geq \lfloor \frac k{ \frac k{\lfloor \frac kx \rfloor} } \rfloor = \lfloor \frac kx \rfloor\),即$\lfloor \frac k{g(x)} \rfloor \geq \lfloor \frac kx \rfloor$ 又$\lfloor \frac k{g(x)} \rfloor \leq \lfloor \frac kx \rfloor$,所以$\lfloor \frac k{g(x)} \rfloor = \lfloor \frac kx \rfloor$。
所以$\forall i \in [x,\lfloor \frac k{\lfloor \frac kx \rfloor} \rfloor]\(,\)\lfloor \frac ki \rfloor$的值都相等!其实之前的猜想的“最大”是很显然的,也没必要再去证一遍了,就算不是最大的,也不影响我们的这个程序。
下面我们就有了一个算法:统计$[1,g(1)]\(的区间里的\)\lfloor \frac ki \rfloor \cdot i$的和,既然$\lfloor \frac ki \rfloor$都一样,那就用等差数列求和公式来算一下即可。然后在从$g(1)+1$到$g(g(1)+1)$这段区间再如此统计……重复上述步骤,直到$i>k$,此时$\lfloor \frac ki \rfloor$一定等于0,直接令g(i)=n,统计i..n即可。
下面我们算一下时间复杂度。这个时间复杂度,应该等于$\lfloor \frac ki \rfloor$有多少个不同的取值是一样的。当$i \leq \sqrt k$时,i只有$\sqrt k$中取值,所以$\lfloor \frac ki \rfloor$也最多只有$\sqrt k$种取值。当$i > \sqrt k$时,\(\lfloor \frac ki \rfloor < \sqrt k\),所以$\lfloor \frac ki \rfloor$也最多只有$\sqrt k$种取值,所以$\lfloor \frac ki \rfloor$一共最多$2 \sqrt k$种取值。所以该算法的之间复杂度为$O(\sqrt k)$。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
int n,k;ll ans;
int main(){
scanf("%d%d",&n,&k);ans=1ll*n*k;
for(register int i=1,g;i<=n;i=g+1){
if(k/i!=0)g=min(n,k/(k/i));else g=n;//错误笔记:如果k/i==0即k<i的话,k/(k/i)会炸掉,所以要特判一下。
ans-=(ll)(k/i)*(i+g)*(g-i+1)/2;
}
printf("%lld\n",ans);
}
CQOI2007 余数之和的更多相关文章
- BZOJ 1257: [CQOI2007]余数之和sum
1257: [CQOI2007]余数之和sum Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 3769 Solved: 1734[Submit][St ...
- 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 ...
- BZOJ_1257_ [CQOI2007]余数之和sum_数学
BZOJ_1257_ [CQOI2007]余数之和sum_数学 题意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值. 分 ...
- BZOJ 1257: [CQOI2007]余数之和
1257: [CQOI2007]余数之和 Time Limit: 5 Sec Memory Limit: 128 MB Description 给出正整数n和k,计算j(n, k)=k mod 1 ...
- 1257: [CQOI2007]余数之和
题目链接 bzoj1257: [CQOI2007]余数之和 题解 数论分块,乘等差数列求和 代码 #include<bits/stdc++.h> using namespace std; ...
- bzoj千题计划173:bzoj1257: [CQOI2007]余数之和sum
http://www.lydsy.com/JudgeOnline/problem.php?id=1257 k%i=k-int(k/i)*i 除法分块,对于相同的k/i用等差序列求和来做 #includ ...
- BZOJ1257 CQOI2007 余数之和 【数分块】
BZOJ1257 CQOI2007 余数之和 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值 其中 ...
随机推荐
- Jenkins slave-agent.jnlp 无法安装为服务(install as a service)
问题: 在部署持续集成环境,配置slave节点时遇到一个问题,slave-agent.jnlp可以正常启动运行(不能正常启动的点这里) 但是在保存为系统服务时,slave-agent.jnlp点击[i ...
- IDEA创建springboot异常(Failed to load class "org.slf4j.impl.StaticLoggerBinder")
IDEA中创建springboot项目遇到的问题 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". ...
- codecs模块, decode、encode
使用codecs模块,在Python中完成字符编码 字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法.从单字节到多字节叫做decoding,从多字节到单字节叫做encodin ...
- loj#137 最小瓶颈路 加强版
分析 我们知道答案一定再最小生成树上 于是我们按边权从小到大建立kruskal重构树 然后每次查询lca的值即可 由于询问较多采用st表维护lca 代码 格式化代码 #include<bits/ ...
- gradle命令行打包不同环境的apk包
为什么我搜这个? 因为 早上在开发那边我看到他控制不同环境就是在这个下拉框选择不同的环境的 搜索词: Gradle 入门--只此一篇 https://www.jianshu.com/p/001abe1 ...
- vm虚拟机用批处理启动和关闭
title vmware 虚拟机开启中 cls&&echo 正在开启VMware虚拟机,请稍候... "D:\vmware\vmware.exe" -x " ...
- php+form表单的文件上传
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- package和import语句_1
package 和 import语句 >为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间. >package语句 ...
- [eclipse相关] 001 - 启动+运行优化
本随笔参考了其他博客内容,且在验证有效之下才或誊抄或摘录或加上自己经验组合而成. 参考博客: 1,http://zwd596257180.gitee.io/blog/2019/04/17/eclips ...
- Stream的排序
1.list<Integer>的正序 List<Integer> list = new ArrayList<>();list.add(50);list.add(45 ...