洛谷 2261 [CQOI2007]余数求和
一句话题意
求 \(\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]余数求和的更多相关文章
- [洛谷P2261] [CQOI2007]余数求和
洛谷题目链接:[CQOI2007]余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + - + k mod n ...
- 洛谷 P2261 [CQOI2007]余数求和 解题报告
P2261 [CQOI2007]余数求和 题意: 求\(G(n,k)=\sum_{i=1}^n k \ mod \ i\) 数据范围: \(1 \le n,k \le 10^9\) \(G(n,k)\ ...
- 洛谷——P2261 [CQOI2007]余数求和
P2261 [CQOI2007]余数求和 关键在于化简公式,题目所求$\sum_{i=1}^{n}k\mod i$ 简化式子,也就是$\sum_{i=1}^{n}(k-\frac{k}{i}\time ...
- 洛谷 P2261 [CQOI2007]余数求和
洛谷 一看就知道是一个数学题.嘿嘿- 讲讲各种分的做法吧. 30分做法:不知道,这大概是这题的难点吧! 60分做法: 一是直接暴力,看下代码吧- #include <bits/stdc++.h& ...
- 洛谷P2261 [CQOI2007] 余数求和 [数论分块]
题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...
- 洛谷 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 ...
- [Luogu 2261] CQOI2007 余数求和
[Luogu 2261] CQOI2007 余数求和 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \( ...
- 【洛谷P2261】余数求和
题目大意:给定 n, k,求\(\sum\limits_{i=1}^n k\%n\) 的值. 题解:除法分块思想的应用. \(x\%y=x-y\lfloor {x\over y}\rfloor\),因 ...
- 整除分块学习笔记+[CQOI2007]余数求和(洛谷P2261,BZOJ1257)
上模板题例题: [CQOI2007]余数求和 洛谷 BZOJ 题目大意:求 $\sum^n_{i=1}k\ mod\ i$ 的值. 等等……这题就学了三天C++的都会吧? $1\leq n,k\leq ...
随机推荐
- HDU 3549 Flow Problem (dinic模版 && isap模版)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 题意: 给你一个有向图,问你1到n的最大流. dinic模版 (n*n*m) #include ...
- FactoryMethod
工厂方法模式 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类 工厂方法的简单实现 (1)创建简单的产品接口 /** * 创建产品接口 * @autho ...
- iterator取集合元素
1,完整代码 //创建两个arraylist对象 Collection al = new ArrayList(); //al1添加元素 al.add("name1"); al.ad ...
- MFC中 编辑框输入换行功能
首先修改编辑框的属性: Multiline 设为true , Auto HScroll 设为true , Auto VScroll 设为 true . 然后响应PreTranslateMessage( ...
- vim g s 替换区别
vim g s 替换区别 PS:一篇好文收藏备用,今天用它解决了一个大问题. 发信人: vale (浅谷), 信区: VIM标 题: global命令详解 发信站: 水木社区 (Fri Ju ...
- 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径
题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...
- srm 541
资瓷点这里阅读该文章O_o 250 Solution 水题,最暴力的方法枚举就可以 Code #include <bits/stdc++.h> using namespace std; # ...
- sql数据库log自动增长被取消
原因分析:数据库可分配空间为0 解决方法:增加数据库初始大小
- 【Unity 3D】学习笔记三十三:游戏元素——天空盒子
天空盒子 一般的3D游戏都会有着北京百年一遇的蓝天.让人惊叹不已.事实上天空这个效果没有什么神奇的仅仅需用到天空盒子这个组件即可.能够将天空设想成一个巨大的盒子,这个盒子将整个游戏视图和全部的游戏元素 ...
- php selenium 测试验证码问题
$this->pause(10000)这段代码用于停止程序执行,可以在这个空隙内输入验证码