P1014Cantor表(找规律)
傳送門
題目描述
現代數學的著名證明之一是Georg Cantor證明了有理數是可枚舉的。他是用下面這一張表來證明這一命題的:
1/1 , 1/2 , 1/3 , 1/4, 1/5, …
2/1, 2/2 , 2/3, 2/4, …
3/1 , 3/2, 3/3, …
4/1 , 4/2, …
5/1 , …
…
我們以Z字形給上表的每一項編號。第一項是1/1,然后是1/2,2/1,3/1,2/2,…
輸入格式:
整數N(1≤N≤10000000)
輸出格式:
表中的第N項
輸入樣例#1:
7
輸出樣例#1:
1/4
分析
- 看到這道題的時候沒想那么多,直接模擬O(n)O(n)O(n)的時間復雜度就過了。看了dalao們的八仙過海各顯神通的題解,覺得自己還是孤陋寡聞了。除了直接模擬外,還有兩種值的學習的方法。
枚舉每一條斜線,找到所求的項所在的斜線,然后,時間復雜度為O(n)O(\sqrt{n})O(n?)。
斜線上的項可以用如下三角形表示(當然,需要偶數行需要逆序)
1
2 3
4 5 6
7 8 9 10
可以看出,每行有第iii行有iii項,而且每行中第kkk個元素一定小于或等于行數iii,于是我們就可以對各行進行枚舉了。
二分法:經過觀察可以知道,第i條斜線上每項分子和分母的值和都為i+1,其中包含[i?(i?1)2+1,(1+i)?i2][\frac{i*(i-1)}{2}+1,\frac{ (1+i)*i} { 2}][2i?(i?1)?+1,2(1+i)?i?]這個區間中所有的項,用二分的方法就可以快速找到所求項所在的直線了。
區間的推導:
通過上面那個三角形可以看出,第iii層包含iii項,如果要求iii層中共有多少項,可以問題可以轉化為等差數列前iii項和,公式為(1+i)?i2(1+i)*i \over 22(1+i)?i?。根據這個公式我們可以知道,第iii的第1項為前i?1i-1i?1層的項數和加1,第iii的第iii項為前iii層的項數和。
求該項是該層的第幾項:
設層數為iii,該項是該層的第aaa項,可得
a=n?i?(i?1)2a=n-\frac{i*(i-1)}{2}a=n?2i?(i?1)?
代碼如下
總結
以上是生活随笔為你收集整理的P1014Cantor表(找规律)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: P1464 Function(递归式的记
- 下一篇: Java 二维数组的初始化