两道趣题

好吧,估计以后会觉得这两道题很沙雕,但我现在实在太菜了……


pro.1 给定\(n\),求$ \sum\limits_{i = 1}^n {\left[ {\frac{n}{i}} \right]} $,数据范围\(1 \leqslant n \leqslant 10^{12}\)

首先\(O(n)\)肯定凉了,所以得找规律(又是找规律,害怕.jpg
根据 看std 手模与观察,可以发现在一段区间内的值是相等的,最明显的就是在\(\left[ {\frac{n}{{n/2}}} \right]\)之后所有的值都是\(1\),从这里入手,进一步发现连续为同一个值的个数为\(\left[ {\frac{n}{{[n/i]}}} \right]-i+1\)个,于是我们便可以在接近\(O(\log n)\)的复杂度内求解之。
在考场上,想到这里一般这道题就结束了,但我不禁还是要刨根问底一下,为什么是这样呢?毕竟如果每次总凭借直觉来做题是没有多大提高的。
其实(这词用得好像我一下就想出来了一样2333),在每次求得一个商\([n/i]=d\)时,我们实际上是在回答这样一个问题:“在\(n\)中有多少个\(i\)?(当然答案是\(d\))”,但是我们要求的东西却是:“有多少个连续的\(d\)?”首先我们知道,在\(n\)中最多有\([n/d]\)\(d\),但是在\(i\)之前有比\(d\)更大的商,所以要把比它大的个数减去,而这个个数刚好是\(i-1\)个,于是答案便呼之欲出。

猜你喜欢

转载自www.cnblogs.com/wzzyr24/p/11615386.html