題目背景題目描述
小 c 養了一些很可愛的兔子。 有一天,小 c 突然發現兔子們都是嚴格按照偉大的數學家斐波那契提出的模型來進行 繁衍:一對兔子從出生後第二個月起,每個月剛開始的時候都會產下一對小兔子。我們假定, 在整個過程中兔子不會出現任何意外。
小 c 把兔子按出生順序,把兔子們從 1 開始標號,並且小 c 的兔子都是 1 號兔子和 1 號兔子的後代。如果某兩對兔子是同時出生的,那麼小 c 會將父母標號更小的一對優先標 號。
如果我們把這種關係用圖畫下來,前六個月大概就是這樣的:
其中,乙個箭頭 a → b 表示 a 是 b 的祖先,相同的顏色表示同乙個月出生的兔子。
為了更細緻地了解兔子們是如何繁衍的,小 c 找來了一些兔子,並且向你提出了 m 個 問題:她想知道關於每兩對兔子 a
ia_i
ai和 b
ib_i
bi,他們的最近公共祖先是誰。你能幫幫小 c 嗎?
一對兔子的祖先是這對兔子以及他們父母(如果有的話)的祖先,而最近公共祖先是指 兩對兔子所共有的祖先中,離他們的距離之和最近的一對兔子。比如,5 和 7 的最近公共祖 先是 2,1 和 2 的最近公共祖先是 1,6 和 6 的最近公共祖先是 6。
輸入格式:
從標準輸入讀入資料。 輸入第一行,包含乙個正整數 m。 輸入接下來 m 行,每行包含 2 個正整數,表示 a
ia_i
ai和 b
ib_i
bi。
輸出格式:
輸出到標準輸出中。 輸入一共 m 行,每行乙個正整數,依次表示你對問題的答案。
輸入樣例:
511
2357
713412
輸出樣例:
112
24
說明【資料範圍與約定】 子任務會給出部分測試資料的特點。如果你在解決題目中遇到了困難,可以嘗試只解 決一部分測試資料。 每個測試點的資料規模及特點如下表:
特殊性質 1:保證ai,
bia_i,b_i
ai,bi
均為某乙個月出生的兔子中標號最大的一對兔子。例如,對於前六個月,標號最大的兔子分別是 1, 2, 3, 5, 8, 13。
特殊性質 2:保證∣ai
−bi∣
≤1\left|a_i-b_i\right|\leq1
∣ai−b
i∣≤
1 所以這到底是一道圖論題呢,還是一道數論題呢?
我陷入沉思……
順便打個廣告:
談談最近公共祖先(lca倍增)——楊子曰演算法
數學合集
首先,我們先要深度理解一下這個兔子和斐波那契數列的關係,我們列一張表看看:
月份這個月的總兔子數
這個月出生的兔子數11
\210
3214
3155
2683
71358
218你會發現左邊那一列和右邊那一列都是斐波那契數列,兩列錯位了兩個格仔
我們再來觀察一下這個編號,你會發現一些重要的東西
假設當前到了第n輪,總兔子數是f[n
]f[n]
f[n]
,可以生小兔子一定是前f[n
−1]f[n-1]
f[n−1]
只,不能生小兔子是後f[n
−2]f[n-2]
f[n−2]
只到了下個月,兔子會多f[n
−1]f[n-1]
f[n−1]
只,由於之前就有f[n
]f[n]
f[n]
只兔子,所以它們的編號會從f[n
]+1f[n]+1
f[n]+1
開始編號
也就是說
第1只兔子的孩子是f[n]+1
第2只兔子的孩子是f[n]+2
第3只兔子的孩子是f[n]+3
……第f[n-1]只兔子的孩子是f[n]+f[n-1]=f[n+1]
有沒有發現媽媽和孩子之間的編號差是f[n
]f[n]
f[n]
,那麼現在給我們乙個編號x我們怎麼找到它的媽媽,或者說這個f[n
]f[n]
f[n]
我們要怎樣才能得到捏?
機智的你一定會發現f[n]就是小於x的最大的斐波那契數
兒子編號=f[n]+媽媽編號
而媽媽編號又一定小於等於f[n
−1]f[n-1]
f[n−1]
,so,兒子編號一定小於等於f[n
+1]f[n+1]
f[n+1]
so,我們只要找到小於x斐波那契數中最大的那乙個就行了,然後減一下,我們就可以檢索到它的媽媽了,那麼我們就知道所有的母子關係了,然後我們就可以暴力地去找lca了
不停地把當前編號小的往上跳,知道跳到同乙個節點了就是lca
ok,完事
c++**:
#include
#define ll long long
using
namespace std;
ll f[65]
;void
init()
}ll query
(ll x,ll y)
intmain()
return0;
}
參考:
於hg機房
洛谷 P3938 斐波那契
原題連線 小 c 養了一些很可愛的兔子。有一天,小 c 突然發現兔子們都是嚴格按照偉大的數學家斐波那契提出的模型來進行 繁衍 一對兔子從出生後第二個月起,每個月剛開始的時候都會產下一對小兔子。我們假定,在整個過程中兔子不會出現任何意外。小 c 把兔子按出生順序,把兔子們從 1 開始標號,並且小 c ...
P3938 斐波那契
腦子還真的是好東西,自己太笨了 容易發現父親節點和兒子節點的關係 兒子節點大於父親節點 兒子節點和父親節點之差為斐波那契數,且斐波那契數為小於兒子節點的最大的乙個 1e12中有60左右的斐波那契數,打出表來查詢就好了,深度不超過60 include include include include i...
P3938 斐波那契
坑爹入口 我們想一下,第幾個生的。那他的孩子就是排在新一波出生的第幾個上的。然後我們通過瞎試得到。10 12 斐波那契的第60項。就是說我們不用建圖 也建不下 每次最多60次暴力就可以了。出題人真是個人才。include include includeusing namespace std long...