题目戳这里

一句话题意

求 \(\sum_{i=1}^{n} (k ~~\texttt{mod} ~~i)\)

Solution

30分做法:

说实话并不知道怎么办。

60分做法:

很明显直接一遍o(n)枚举 i 就可以求出。

100分做法:

对于每一个k mod i,我们知道k mod i = k-k/i*i,那么

\(\quad \sum_{i=1}^{n}{k \quad mod \quad i}=n*k-\sum_{i=1}^{n}(k/i*i)\)

所以这个题目就转化成了求 \(\sum_{i=1}^{n}(k/i*i)\)。

于是我们很敏锐地察觉到 k/i 貌似有点可操作性 (胡乱BB),因为我们发现对于一段区间的i,k/i 的值是一样的并且是连续的区间,例如:

100/25=100/24=100/23=100/22=100/21=4,因为这一段k/i的值都相等,那么可以一起计算,我们只需要运用等差数列求和公式求出21到25之和,再乘上4便是要求的值。

那么我们定义一个L和R,表示k/i的值相等的区间的两个端点。

首先我们可以知道L=上一次的R+1(区间都是连续的)。

因为L是当前区间中i的最小值,那么最大值就是k/(k/i)。

打个比方:21是100/i=4中最小的i,那么此区间中最大的就是100/4=25。

那么思路就很明显了:

首先Ans=n×k,再减去\(\sum_{i=1}^{n}(k/i*i)\)。

对于公式\(\sum_{i=1}^{n}(k/i*i)\):

初始值L=1,R=0,然后L=上一个R+1,R=k/(k/L)。

每次Ans-=(k/L)×(R-L+1)×(L+R)/2(等差数列求和,应该都懂)。

直到R=n即可,注意R=min(k/(k/L),n),以防越界。

时间复杂度 巨说是\(o(\sqrt{n})\)。

Ps:要开long long!!!!

Coding

60分代码

#include <bits/stdc++.h>
using namespace std;
_int main()
{
long long n,k,ans=0;
cin>>n>>k;
for (long long i=1;i<=n;++i)
ans+=(k%i);
cout<<ans;
return 0;
}

100分代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
long long l,r,n,k,ans;
cin>>n>>k;
ans=n*k;
l=1;
r=0;
while(r<n)
{
if(k/l!=0) r=min(k/(k/l),n);
else r=n;
ans-=(k/l)*(r-l+1)*(l+r)/2;
l=r+1;
}
cout<<ans;
return 0;
}

传说中的极简AC不易懂,233.

洛谷 2261 [CQOI2007]余数求和的更多相关文章

  1. [洛谷P2261] [CQOI2007]余数求和

    洛谷题目链接:[CQOI2007]余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n ...

  2. 洛谷 P2261 [CQOI2007]余数求和 解题报告

    P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...

  3. 洛谷——P2261 [CQOI2007]余数求和

    P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...

  4. 洛谷 P2261 [CQOI2007]余数求和

    洛谷 一看就知道是一个数学题.嘿嘿- 讲讲各种分的做法吧. 30分做法:不知道,这大概是这题的难点吧! 60分做法: 一是直接暴力,看下代码吧- #include <bits/stdc++.h& ...

  5. 洛谷P2261 [CQOI2007] 余数求和 [数论分块]

    题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...

  6. 洛谷 P2261 [CQOI2007]余数求和 ||整除(数论)分块

    参考:题解 令f(i)=k%i,[p]表示不大于p的最大整数f(i)=k%i=k-[k/i]*i令q=[k/i]f(i)=k-qi如果k/(i+1)=k/i=qf(i+1)=k-q(i+1)=k-qi ...

  7. [Luogu 2261] CQOI2007 余数求和

    [Luogu 2261] CQOI2007 余数求和 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \( ...

  8. 【洛谷P2261】余数求和

    题目大意:给定 n, k,求\(\sum\limits_{i=1}^n k\%n\) 的值. 题解:除法分块思想的应用. \(x\%y=x-y\lfloor {x\over y}\rfloor\),因 ...

  9. 整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)

    上模板题例题: [CQOI2007]余数求和 洛谷 BZOJ 题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值. 等等……这题就学了三天C++的都会吧? $1\leq n,k\leq ...

随机推荐

  1. eclipse启动Tomcat时报错:严重: Exception loading sessions from persistent storage

    我的项目工程是Spring+hibernate+structs  1.0,最近启动tomcat时多次遇到如下异常: 严重: IOException while loading persisted se ...

  2. ACM信息汇总

    一.ACM算法总结及刷题参考 (摘自:http://www.cnblogs.com/flipped/p/5005693.html) 初期: 一.基本算法: (1)枚举. (poj1753,poj296 ...

  3. mongodb培训

    写在前面 公司组织的技术培训,虽然刚接触mongodb没多久,算是入门吧,就组织一次mongodb的入门ppt培训.包括nosql的简单介绍,以及mongodb的一些优缺点,最后包括mongodb的一 ...

  4. 关于Android方法数量限制的问题

    限制Android方法数量的原因是: Android应用以DEX文件的形式存储字节码文件,在Dalvik字节码规范里,方法引用索引method referenceindex只有16位,即65536个. ...

  5. Linux系统救援模式应用:单用户模式找回密码

    利用Linux系统救援模式找回密码 方法一: 开机时手要快按任意键,因为默认时间5s grub菜单,只有一个内核,没什么好上下选的,按e键.升级了系统或安装了Xen虚拟化后,就会有多个显示. 接下来显 ...

  6. hdu 5339 Untitled【搜索】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5339 题意:一个整数a 和一个数组b.问你能否在b中取出r个元素排列组成c数组满足a%c1%c1%-. ...

  7. IDEA破解 2017 IDEA license server 激活(可用)

    进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.PHP(注意:php要小写)即可~

  8. java怎样将一个List传入Oracle存储过程

    java怎样将一个List传入Oracle存储过程.样例例如以下: 数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tables_array AS VARRAY(10 ...

  9. 【C语言天天练(十一)】深入理解指针

    引言:在C语言中.指针的地位是不言而喻的,要想非常好的掌握C语言,掌握指针是必须的,这也是C语言不同于其它语言的地方. (一)指针的指针 样例: int i; int *pi;/*把pi初始化为指向变 ...

  10. C# 调用API接口处理公共类 自带JSON实体互转类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...