当前位置 : 主页 > 大数据 > 区块链 >

两道趣题

来源:互联网 收集:自由互联 发布时间:2021-06-22
好吧,估计以后会觉得这两道题很沙雕,但我现在实在太菜了…… pro.1 给定 \(n\) ,求$ \sum\limits_{i = 1}^n {\left[ {\frac{n}{i}} \right]} $,数据范围 \(1 \leqslant n \leqslant 10^{12}\) 。 首先 \(O(n)\)

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


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\)个,于是答案便呼之欲出。


pro.2 给定\(n\),数列\(\{ {a_n}\}\)与区间\([minb,maxb]\),使得方程\(\sum\limits_{i = 1}^n {{a_i}{x_i}} = b\)有非负整数解,其中\(b \in [minb,maxb]\)。数据范围:\(n \leqslant 12,a_i \leqslant 5 \times 10^5,1 \leqslant minb \leqslant maxb \leqslant 10^{12}\)

这题是真的毒瘤,一开始还在想什么高斯消元和线性筛之类的东西……

网友评论