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 余数之和的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 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的值. 分 ...

  7. BZOJ 1257: [CQOI2007]余数之和

    1257: [CQOI2007]余数之和 Time Limit: 5 Sec  Memory Limit: 128 MB Description 给出正整数n和k,计算j(n, k)=k mod 1 ...

  8. 1257: [CQOI2007]余数之和

    题目链接 bzoj1257: [CQOI2007]余数之和 题解 数论分块,乘等差数列求和 代码 #include<bits/stdc++.h> using namespace std; ...

  9. bzoj千题计划173:bzoj1257: [CQOI2007]余数之和sum

    http://www.lydsy.com/JudgeOnline/problem.php?id=1257 k%i=k-int(k/i)*i 除法分块,对于相同的k/i用等差序列求和来做 #includ ...

  10. BZOJ1257 CQOI2007 余数之和 【数分块】

    BZOJ1257 CQOI2007 余数之和 Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n的值 其中 ...

随机推荐

  1. PB系统颜色值

    Colour Red Green Blue 值黑色 Black 0 0 0 0白色 White 255 255 255 16777215灰色 Gray 192 192 192 12632256深灰色 ...

  2. CF889 E Mod Mod Mod——DP

    题目:http://codeforces.com/contest/889/problem/E 这题真好玩. 官方题解说得很好. 想到相邻 a[ i ] 之间的段可能可以一起维护,但是不太会. 原来是表 ...

  3. 学习日记10、easyui编辑器combobox绑定数据的两种方式

    1.数据本地绑定 var card = [{ "value": "正常", "text": "正常" }, { &quo ...

  4. 给网页标题添加icon小图标

    so easy: 给网页标题添加icon小图标: 直接在html文件的head部分添加下面代码(注意href的路径): <link rel="icon" type=" ...

  5. Kubernetes tutorial - K8S 官方入门教程 中文翻译

    官方教程,共 6 个小节.每一小节的第一部分是知识讲解,第二部分是在线测试环境的入口. kubectl 的命令手册 原文地址 1 创建集群 1.1 使用 Minikube 创建集群 Kubernete ...

  6. XML scriptlet 连接数据库

    <%@ page language="java" contentType="text/html" pageEncoding="GBK" ...

  7. JS中设置input的type="radio"默认选中

    html: <input id="Radio1" type="radio" value="男" name="st_Sex&q ...

  8. 如何通过xmake进行交叉编译

    xmake 提供了方便灵活的交叉编译支持,大部分情况下,都不需要配置很复杂的toolchains前缀,例如:arm-linux- 什么的 只要这个toolchains目录满足如下结构(大部分的交叉工具 ...

  9. python-生成式的基本使用

    生成式是python中的一种高级玩法,起码看起来显得要高级一点.它可以使用简单的一行代码实现列表.字典等数据类型的创建或数据类型的转换等任务.另外,它和生成器还有些许关联. 列表生成式 列表生成式即生 ...

  10. [Linux] 012 文件搜索命令

    文件搜索命令:find 命令名称:find 命令所在路径:/bin/find 执行权限:所有用户 语法:find [搜索范围] [匹配条件] 功能描述:文件搜索 范例: 在目录 /etc 中查找文件 ...