[Luogu 2261] CQOI2007 余数求和

<题目链接>


这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊。

这题一看暴力很好打,然而 \(10^{9}\) 的范围注定会卡掉暴力。

所以我们要用除法分块来优化。

由题意得:\(ans = \sum_{i=1}^{n} k \bmod i\)

我们知道,\(a \bmod b = a - b \times \lfloor \frac{a}{b} \rfloor\)

因此,\(ans = \sum_{i=1}^{n} k - i \times \lfloor \frac{k}{i} \rfloor = nk - \sum_{i=1}^{n} i \times \lfloor \frac{k}{i} \rfloor\)

我们用样例来打表找规律,发现 \(\lfloor \frac{k}{i} \rfloor\) 分别在一定的区域内相等,如下表所示:

\(i\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\) \(9\) \(10\)
\(\lfloor \frac{k}{i} \rfloor\) \(5\) \(2\) \(1\) \(1\) \(1\) \(0\) \(0\) \(0\) \(0\) \(0\)

可见 \(\lfloor \frac{k}{i} \rfloor\) 分成了 \(3\) 块,我们只需要计算 \(n \times k\) 减去每一块的和即可。

首先枚举块的左边界 \(l\),并根据左边界和 \(k\) 计算出右边界 \(r\)。

令 \(t = \lfloor \frac{k}{l} \rfloor\),分两种情况讨论:

  • \(t \neq 0\),则 \(r = \min (\lfloor \frac{k}{t} \rfloor , n)\);

  • \(t = 0\),则 \(r = n\)。

(请自行打草稿验证。)

右边界有了,每一块的和也就可以计算出了。

每一块的和 \(=\) 当前块的 \(t\) \(\times\) 当前块元素个数 \(\times\) 当前块 \(i\) 的平均值 \(= t \times (r-l+1) \times (l+r) \div 2\)

当前块处理完后,令 \(l = r + 1\),开始计算下一块,直到计算至 \(n\)。

除法分块就是这样,在莫比乌斯反演优化中也有作用的。

给出最短小精悍的省选题代码。

记得开long long!

#include <algorithm>
#include <cstdio>
using std::min;
long long n,k,ans;
int main(int argc,char *argv[])
{
scanf("%lld %lld",&n,&k);
for(long long l=1,r,t;l<=n;l=r+1)
r=(t=k/l) ? min(k/t,n) : n,ans-=t*(r-l+1)*(l+r)>>1;
printf("%lld\n",ans+n*k);
return 0;
}

谢谢阅读。

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

  1. [Luogu P2261] [CQOI2007]余数求和 (取模计算)

    题面 传送门:https://www.luogu.org/problemnew/show/P2261 Solution 这题显然有一个O(n)的直接计算法,60分到手. 接下来我们就可以拿出草稿纸推一 ...

  2. 洛谷 2261 [CQOI2007]余数求和

    题目戳这里 一句话题意 求 \(\sum_{i=1}^{n} (k ~~\texttt{mod} ~~i)\) Solution 30分做法: 说实话并不知道怎么办. 60分做法: 很明显直接一遍o( ...

  3. LUOGU P2261 [CQOI2007]余数求和(数论分块)

    传送门 解题思路 数论分块,首先将 \(k\%a\) 变成 \(k-a*\left\lfloor\dfrac{k}{a}\right\rfloor\)形式,那么\(\sum\limits_{i=1}^ ...

  4. Luogu P2261 [CQOI2007]余数求和

    最近中考放假几天都在怼一道BJOI2018的水题,但卡死在90pts跑不动啊! 然后今天发现终于过了然而Hack的数据全RE了然后就开始找新的题目来找回信心. 然后发现智能推荐里有这道题,然后想了1m ...

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

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

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

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

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

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

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

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

  9. 题解 P2261【[CQOI2007]余数求和】

    P2261[[CQOI2007]余数求和] 蒟蒻终于不看题解写出了一个很水的蓝题,然而题解不能交了 虽然还看了一下自己之前的博客 题目要求: \[\sum_{i=1}^{n}{k \bmod i} \ ...

随机推荐

  1. centos环境配置(nginx,node.js,mysql)

    1.安装 Install GCC and Development Tools on a CentOS yum group install "Development Tools" n ...

  2. Spark GraphX 2

    顶点:VertexRDD   边:EdgeRDD.Edge.EdgeDirection   Triplet:EdgeTriplet   存储:PartitionStrategy 通常的存储方式有两种: ...

  3. asp.net中Repeater结合js实现checkbox的全选/全不选

    前台界面代码: <input name="CheckAll" type="checkbox" id="CheckAll" value= ...

  4. win7主题/默认账户图片路径

    账户图片位置 C:\ProgramData\Microsoft\User Account Pictures 主题位置 C:\Windows\Resources

  5. php 生成短网址 代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  6. Linux和Windows文件路径

    linux系统下的文件夹路径和window下的不一样,windows下就需要写成“\\photos"因为java会把第一个"\"当成转义字符给“吃了”.但在linux下就 ...

  7. MongoDB、ElasticSearch、Redis、HBase这四种热门数据库的优缺点及应用场景

    MongoDB MongoDB是当今最火爆的NoSQL数据库.MongoDB最早在09年发布,算得上是早期大数据时代的数据库代表作了.随着MongoDB的火爆,研发MongoDB的团队还专门成立了Mo ...

  8. JVM(二)GC

    GC简介 Java堆内存 在运行时,java的实例被存放在堆内存区域.当一个对象不在被引用,满足条件就会从堆内存移除并且内存空间被回收.堆内存由三个主要区域 1.新生代     Eden空间(任何实例 ...

  9. [剑指Offer] 52.正则表达式匹配

    题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  10. 第30天:DOM对象操作

    JS包括三部分:ECMAscript.DOM(文档对象).BOM(浏览器对象) 一.DOM(文档对象)DOM树节点(元素.属性.标签.标记等都是节点) 二.访问节点 documment.getElem ...