题解 P1014 【Cantor表】
wmxwmx
2018-01-23 23:44:37
虽然说这道题是考**模拟**.但是为啥感觉很多人真的都在写模拟....
这道题应该是属于那种给个数据那台计算器都能手打出结论的题哈.
数据小了都不用计算器都能在初中数学范围之内吧。
很明显就是O(1)复杂度(~~这里忽略系统开根的复杂度~~),求出Z形侧过来的三角形的行数
然后O(1)复杂度(~~又一次忽略系统乘法的复杂度~~),算出结果。
以下是公式以及简要的解释
已知数据是第![](http://latex.codecogs.com/gif.latex?%5Clarge%20n)个。
明显Z形画出来的三角,从左上到右下的行数是从1开始公差为1的**等差数列**。所以利用**求和公式**,设**行数**为![](http://latex.codecogs.com/gif.latex?%5Clarge%20a)的话则有:
![](http://latex.codecogs.com/gif.latex?%5Clarge%20%5Cfrac%7Ba%5Ctimes%20%28a-1%29%7D%7B2%7D%3C%20n%5Cle%20%5Cfrac%7B%281+a%29%5Ctimes%20a%7D%7B2%7D)
因此我们 设![](http://latex.codecogs.com/gif.latex?%5Clarge%20x)使得
![](http://latex.codecogs.com/gif.latex?%5Clarge%20%5Cfrac%7B%281+x%29%5Ctimes%20x%7D%7B2%7D%3Dn)
根据建立起的函数的**递增性**,可知![](http://latex.codecogs.com/gif.latex?a%3D%5Clceil%20x%5Crceil)
所以通过**求根公式**求出![](http://latex.codecogs.com/gif.latex?%5Clarge%20x)然后**向上取整**就可以在O(1)的时间复杂度求出行数了。
## Which is ![](http://latex.codecogs.com/gif.latex?%5CLARGE%20a%3D%5Clceil%5Cfrac%7B-1+%5Csqrt%7B1+8%5Ctimes%20n%7D%7D%7B2%7D%5Crceil)
接下来,还要求出所在当行的具体位置,这个就很容易了,只需要知道 到![](http://latex.codecogs.com/gif.latex?a-1)那一行总共有多少个:明显![](http://latex.codecogs.com/gif.latex?%5Cfrac%7Ba%5Ctimes%20%28a-1%29%7D%7B2%7D)个
### 所以要求的也就是![](http://latex.codecogs.com/gif.latex?%5Clarge%20a)那一行的第![](http://latex.codecogs.com/gif.latex?n-%5Cfrac%7Ba%5Ctimes%20%28a-1%29%7D%7B2%7D)个。
接下来是一个对于知道**行数+第几个**的Cantor形式求法:
对于第a行,中所有个体,都有(“/”左边)+(“/”右边)![](http://latex.codecogs.com/gif.latex?%5Clarge%20=a+1)
同时 ![](http://latex.codecogs.com/gif.latex?%5Cforall%20a%5Cin%20N),![](http://latex.codecogs.com/gif.latex?a%5Cequiv0%28mod%5C%202%29)
### 结果是: <u>(\_第几个\_ )/(a+1- \_第几个\_ )</u>
### <u>而剩下的则“/”**两边相反**即好。</u>
以上就是O(1)(~~其实应该没比二分快多少,相当于让系统做了二分而已~~)解决此题的详解。既然是数学推算,代码就不贴了,没啥意思。