博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数论中的分块思想
阅读量:5086 次
发布时间:2019-06-13

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

首先说说什么是分块。所谓分块就是将规模为n的问题划分为就是将规模为n问题划分为k块,每块规模为s。那么对块内的操作和整个范围内的操作的复杂度要平均,即令k=s=sqrt(n)通过这个思想可以把O(n)的复杂度降到O(sqrt(n)),达到优化算法的目的。

看道例题:中文题,题目就是求

而可以通过变换得到:转换到这步的时候。注意到对于某些连续的i,[k/i]的值是相同的。我们可以在O(1)的时间求出[k/i]相同的时候i*[k/i]的和。注意一下当i>k的时候k mod i的值是k。所以总的复杂度是O(sqrt(k))。代码君:

View Code
#include 
#include
#include
#include
using namespace std;int main() { long long n, k, ans = 0; scanf("%lld %lld", &n, &k); if (n > k) { ans += (long long)(n - k) * k; n = k; } ans += n * k; for (long long i = 1, last; i <= n; i = last + 1) { last = min((long long)n, k/(k/i)); ans -= (k/i) * (i+last) * (last-i+1) / 2; } printf("%lld\n", ans); return 0;}

 

分块思想很少单独出到题目里。但有些题目需要用这种思想才能顺利Accepted,或者利用这个思想来优化你的程序。比如,不用分块来做耗时是5.76s,用了分块之后,耗时可以缩小到1s以内。(PS:这道题的主要考点并不是分块,而是莫比乌斯反演)。

转载于:https://www.cnblogs.com/phonism/archive/2013/04/22/3036665.html

你可能感兴趣的文章
HDU 4635 Strongly connected
查看>>
ASP.NET/C#获取文章中图片的地址
查看>>
Spring MVC 入门(二)
查看>>
格式化输出数字和时间
查看>>
页面中公用的全选按钮,单选按钮组件的编写
查看>>
java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
查看>>
BZOJ 1047 HAOI2007 理想的正方形 单调队列
查看>>
各种语言推断是否是手机设备
查看>>
这个看起来有点简单!--------实验吧
查看>>
PHP count down
查看>>
JVM参数调优:Eclipse启动实践
查看>>
(旧笔记搬家)struts.xml中单独页面跳转的配置
查看>>
不定期周末福利:数据结构与算法学习书单
查看>>
strlen函数
查看>>
python的列表与shell的数组
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>