题目大意

\[\sum_{i=1}^{n}(k\mod i)
\]

\(n,k\leq 10^9\)。

题解

先只考虑\(n\leq k\)的情况。

\[\sum_{i=1}^{n}(k\mod i)=\sum_{i=1}^{n}k-i\lfloor \frac{k}{i}\rfloor=kn-\sum_{i=1}^{n}i\lfloor \frac{k}{i}\rfloor
\]

看到

\[\sum_{i=1}^{n}\lfloor \frac{k}{i}\rfloor
\]

则想到整除分块。

整除分块

结论:

\[\lfloor \frac{k}{i}\rfloor=\lfloor\frac{k}{\lfloor\frac{k}{\lfloor\frac{k}{i}\rfloor}\rfloor}\rfloor
\]

规律

当\(\lfloor\frac{k}{\lfloor\frac{k}{i}\rfloor}\rfloor\)一定时,所有满足上式的\(i\)都在一段连续的区间内(组成了一块),区间右端点是\(\lfloor\frac{k}{\lfloor\frac{k}{i}\rfloor}\rfloor\)。

因此操作时,直接对一块进行统一操作即可。

数学推导

令一块的左端点为\(l\),右端点为\(r\),\(v=\frac{k}{r}\),我们现在要求一块内的和

\[\sum_{i=l}^{r}iv=\sum_{i=0}^{r-l}v(l+i)=v\sum_{i=0}^{r-l}(l+i)
\]

此时注意:和式中运算的次数为\(r-l-0+1=r-l+1\),而不是\(r-l\)。所以接下来

\[原式\neq v(l(r-l)+\sum_{i=0}^{r-l}i)
\]

\[原式=v(l(r-l+1)+\sum_{i=0}^{r-l}i)
\]

在这里错了就完了!

最终运用等差数列的知识得到

\[原式=\frac{v(r+l)(r-l+1)}{2}
\]

把所有的上式加起来再被\(nk\)一减即可。

注意

边界条件:赋值\(r\)时,它不能直接等于\(\lfloor\frac{k}{\lfloor\frac{k}{i}\rfloor}\rfloor\),而应当是它和\(n\)的较小值。另外还要考虑\(\lfloor\frac{k}{i}\rfloor=0\)的情况。

对于\(n>k\)的情况,把额外值加上即可。要明确\(n-k\)以及\(k\)的含义呀!

#include <cstdio>
#include <cstring>
#include <cassert>
#include <algorithm>
using namespace std; #define ll long long int main()
{
ll n, k;
scanf("%lld%lld", &n, &k);
ll ans = 0, extra = 0;
if (n > k)
{
extra = (n - k) * k;
n = k;
}
for (ll l = 1, r; l <= n; l = r + 1)
{
int divVal;
r = (divVal = k / l) ? min(n, k / (k / l)) : n;
ans += divVal * ((r - l + 1) * (l + r) / 2);
assert(ans > 0);
}
printf("%lld\n", n * k - ans + extra);
return 0;
}

luogu2261 [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 ...

随机推荐

  1. JDK介绍

    Java的版本最开始是1995年的JDK Alpha and Beta版本,第二年发布JDK1.0版本之后就是JDK1.1,JDK1.2.到1998年,不再叫JDK了,而是叫J2SE,但是版本号还是继 ...

  2. android开发 设备调试问题

    如果在mac下面用趁机开发android程序,发现不能连接上时就需要进行简单设置即可 先设置Finder为可以显示所有隐藏文件夹: 打开终端,输入如下命令: 显示Mac隐藏文件的命令:defaults ...

  3. Oracle 循环调用存储过程

    create or replace procedure p_test_loop as --定义一个游标,并将查询结果集赋值给它 CURSOR c1 IS select * from tbltest w ...

  4. Java 入门作业

  5. SQLite-编译指示

    SQLite – 编译指示 SQLite编译指示命令(PRAGMA)是一个特殊的命令是用于控制各种环境变量和状态标志在SQLite的环境.编译指示值可以读取,也可以根据需求设置. 语法: 查询当前的编 ...

  6. Step by Step 开发dynamics CRM

    这里是作为开发贴的总结. 现在plugin和workflow系列已经终结. 希望这些教程能给想入坑的小伙伴一些帮忙. CRM中文教材不多, 我会不断努力为大家提供更优质的教程. Plugin 开发系列 ...

  7. java HttpURLConnection 登录网站 完整代码

    import java.io.*; import java.util.*; import java.net.*; public class WebTest { public static void m ...

  8. 【转载】Java 集合详解

    转载:https://www.cnblogs.com/ysocean/p/6555373.html 一.集合的由来 通常,我们的程序需要根据程序运行时才知道创建多少个对象.但若非程序运行,程序开发阶段 ...

  9. python PIL图像处理-框选

    框选图中位置 代码 from PIL import Image,ImageDraw,ImageFont,ImageFilter import random #--------------------- ...

  10. C#第十五节课

    函数复习 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System. ...