博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P2261 [CQOI2007]余数求和
阅读量:5732 次
发布时间:2019-06-18

本文共 854 字,大约阅读时间需要 2 分钟。

前几天在qbxt的时候,好像做到了一道数论分块的题目

那时候只知道有些区间内的的结果是一样的。

然后今天闲来无聊,翻到了这道题。发现是数论分块。就尝试学习了一下

(都快noip了你学这个没有的玩意干什么?)

感觉差不多遇到取模的题(在我这个等级qwq),最难也就是个数论分块的板子

学学吧


记得在学\(exgcd\)的时候,曾将\(a%b\)转化为$a-b\cdot \lfloor \frac{a}{b} \rfloor $的形式

这个题一样可以\(\large{\sum_{i=1}^n} k-\lfloor \frac{k}{i} \rfloor \cdot i\)

然后这个$\lfloor \frac{k}{i}\rfloor $可以分块处理的,就是可能在一段区间内,这个玩意都是不变的。

然后如何快速算出这个区间的和呢?使用平均数。

于是就有了下面的代码

#include
#include
#include
#include
using std::min;int main(){ long long n,k,ans=0; scanf("%lld%lld",&n,&k); ans=n*k; for(long long l=1,r;l<=n;l=r+1)//l/r 当前处理的区间 { if(k/l!=0) r=min(n,k/(k/l));//根据积算出右端点 else r=n;//终止 ans=ans-(k/l)*(r-l+1)*(l+r)/2LL;//平均数一稿 } printf("%lld",ans);//输出}

转载于:https://www.cnblogs.com/Lance1ot/p/9899663.html

你可能感兴趣的文章
洛谷P3763 [TJOI2017]DNA(后缀自动机)
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
NYOJ32:组合数(DFS入门)
查看>>
使用Callable和Future接口创建线程
查看>>
BZOJ 2568 比特集合
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
MongoDB培训
查看>>
机器学习开源项目精选TOP30
查看>>
python基础===对字符串进行左右中对齐
查看>>
一起谈.NET技术,ASP.NET缓存全解析6:数据库缓存依赖
查看>>
代码分析系列 内存执行过程
查看>>
iOS开发-邮件发送
查看>>
/etc/resolv.conf文件详解
查看>>
【转】VC的MFC中重绘函数的使用总结(整理)
查看>>
JQuery日记_5.13 Sizzle选择器(六)选择器的效率
查看>>
System.gc()与Object.finalize()的区别
查看>>
Memcache存储大数据的问题
查看>>
HTML5区域范围文本框实例页面
查看>>
oracle查看经常使用的系统信息
查看>>
ifconfig命令
查看>>