洛谷

一看就知道是一个数学题。嘿嘿~

讲讲各种分的做法吧。

30分做法:不知道,这大概是这题的难点吧!

60分做法:

一是直接暴力,看下代码吧~

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

第二种做法非常接近正解。

首先显然\(k~mod~i=k-\lfloor \frac{k}{i} \rfloor*i\)。

所以我们马上一波转化,\(\sum_{i=1}^{n}k~mod~i=n*k-\sum_{i=1}^{n}\lfloor \frac{k}{i} \rfloor*i\)。

那么这一截\(\sum_{i=1}^{n}\lfloor \frac{k}{i} \rfloor*i\)怎么求呢?

这个时候,直觉会告诉我们,\(\lfloor \frac{k}{i} \rfloor*i\)很有问题。

因为是向下取整,所以会有许多\(\lfloor \frac{k}{i} \rfloor\)是一样的。于是就会有一个一个的区间。

对于每个这样的区间,在乘一个\(i\)后,显然是一个等差数列。

不信看这个:

\((int)8/3=(int)8/4=2~~~~=>~~~~8/3*3+2=8/4*4\)

所以我们可以枚举\(i\),对于每一个\(i\),求出\(t=k/i\),

令\(l=i,r=min(n,k)\)二分,如果\(mid/i=t,l\)扩大,否则\(r\)缩小。

找到后直接等差数列求和。

最后使\(i=r+1\)。这样表面时间复杂度是\(O(\sqrt{n}*log(n))\)。

实则不然,因为我们的\(i\)跳跃的距离基本上很小很小,所以这代码比\(O(n)\)还慢!

看下代码吧!

#include <bits/stdc++.h>
using namespace std;
typedef int _int;
#define int long long int n,k,ans; _int main()
{
cin>>n>>k;
ans=n*k;
for (int i=1;i<=min(n,k);++i) {
int l=i,r=min(n,k),t=k/i,j=i;
while (l<=r) {
int mid=(l+r)/2;
if (mid/i==t) l=mid+1,j=mid;
else r=mid-1;
}
int a1=t*i,an=a1+(j-i)*t,g=j-i+1;
ans-=(g*(a1+an)/2);
i=j;
}
cout<<ans;
return 0;
}

100正解:

有了上面第二个60分做法的思路,正解就不言而喻了。

只要把\(log(n)\)找区间改成\(O(1)\)就好了。

具体怎么改呢?

我们同样的枚举\(i\),假设区间为\([l,r]\),那么\(l=i\)显然,然后就剩\(r\)有点难搞了。

想想,我们每一段的公差都是\(\lfloor \frac{k}{i} \rfloor\),那么显然当\(k~mod~i=0\)时,\(r\)截止。

所以,\(r=k/(k/l)\)。

那么,就完结了,上代码!真正的极简AC难懂~

#include <bits/stdc++.h>
using namespace std;
typedef int _int;
#define int long long
int n,k,ans;
_int main()
{
cin>>n>>k;
ans=n*k;
for (int i=1;i<n;++i) {
int l=i,t=k/l,r=t?min(n,k/t):n;
int a1=t*l,an=a1+(r-l)*t,g=r-l+1;
ans-=(g*(a1+an)/2);
i=r;
}
cout<<ans;
return 0;
}

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

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

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

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

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

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

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

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

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

  5. 洛谷 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 ...

  6. 【洛谷P2261】余数求和

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

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

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

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

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

  9. P2261 [CQOI2007]余数求和 【整除分块】

    一.题面 P2261 [CQOI2007]余数求和 二.分析 参考文章:click here 对于整除分块,最重要的是弄清楚怎样求的分得的每个块的范围. 假设$ n = 10 ,k = 5 $ $$  ...

随机推荐

  1. Azure Storage 分块上传

    概述 Azure 存储提供三种类型的 Blob:块 Blob.页 Blob 和追加 Blob.其中,块 Blob 特别适用于存储短的文本或二进制文件,例如文档和媒体文件. 块 Blob 由块组成,每个 ...

  2. CSDN开源夏令营 百度数据可视化实践 ECharts(4)

    ECharts知识点总结: 在应用过程中总会遇到一些难以理解的概念和属性,这里就总结了一下比較难的知识点,方便理解概念.进而更好的掌握ECharts. (1)1.  一个完整的option包括什么?能 ...

  3. 今日头条&58转转笔试

    昨天参加今日头条和58转转的笔试,因为时间上有冲突,所以主要选择参加头条的笔试. 先说头条: 头条的题型: 一道改错题 三道编程题 一道设计题 感受: 做题目的的时候还是有点紧张的,因为突然遇到题目需 ...

  4. Atitit.biz业务系统 面向框架  面向模式---------数据映射imp

    Atitit.biz业务系统 面向框架  面向模式---------数据映射imp 1.1. 面向变量  面向过程  面向对象 面向组件  面向框架  面向服务 面向模式1 1.2. 第2章 架构模式 ...

  5. LNMP平滑升级nginx并安装ngx_lua模块教程

    #ngx_lua module项目地址 https://github.com/chaoslawful/lua-nginx-module 在LNMP安装包后,重编译nginx,并添加ngx_lua模块 ...

  6. 小程序swiper配置参数使用

    不管什么项目,一个轮播是基本少不了的,现在就来踩下微信小程序的swiper吧! 首先打开文档,可以看到下面这些参数:(https://mp.weixin.qq.com/debug/wxadoc/dev ...

  7. Redis入门经典——The Little Redis Book (翻译)

    The Little Redis Book By Karl Seguin 关于本书:本书全然免费下载.你能够任意转载,复制.但请你注明作者.Karl Seguin.译者,WY. 以及不要用于商业用途. ...

  8. Shiro学习(总结)

    声明:本文原文地址:http://www.iteye.com/blogs/subjects/shiro 感谢开涛提供的博文,让我学到了非常多.在这里由衷的感谢你,同一时候我强烈的推荐开涛的博文.他的博 ...

  9. php 图片上传 文件上传 大小 限制

    nginx  413 Request Entity Too Large Php无法上传文件 查看php脚本运行用户,写个php脚本 <?php echo shell_exec("id ...

  10. Photoshop脚本之创建文件夹

    function checkFolder(path){ var folder = Folder(path) if(!folder.exists) folder.create() }