題目連結:
註:這題是由本人出題
題目大意:
有一數列按以下的模式生成:
在數線上從0開始,做一系列的『跳躍』。第一次跳躍跳一個單位,會落到1;第二次跳躍跳兩個單位,落到3;第三次跳三格到6;第四次則因為2尚未到過,所以優先跳回去2。
也就是:每次跳躍的距離為上一次+1。而如果『往回跳』的點曾未到過,則往回跳;不然,往前跳(以數線來講,『往回跳』即是往數線的左側,『往前』則是往數線的右端)。因此同一個點是有可能會跳到兩次以上的。
而對於每一次的跳躍,以起跳點與落地點為兩端點,兩點的距離為半徑,做半圓。每奇數次的跳躍,做下半圓;反之,做上半圓。
如此這般,會畫出以下圖形(附圖非完整圖形):
現在給你此圖形上的一些點之座標(X和Y,皆小於5000000,但 ≧ 0),求這個點是位於第幾次跳躍的時候,所畫出的半圓之上。(若有多種可能,請給出次數最小的那一次,且保證答案小於1000000)。
若X=Y=0,則停止程式(不對此行測資做任何輸出)。
解題思維:
作為本題的始作俑者(?。我只能說除了題目敘述是小說、稍長以外,這題實際上並沒有什麼了不起的演算法。
首先,就是硬A出上面數列(這數列目前沒有所謂的數學公式),照著上面的方式即可。每一次跳躍的距離是上一次的距離+1,前面(數線的左測)沒有跳過的數字優先跳回去;否則,往後跳。
再來就是判斷給定的X、Y是在哪次跳躍上畫出的半圓。
用迴圈按照順序跑過剛剛產生出的數列。每一項跟上一項的數字相減取絕對值和平均值。
絕對值即是上一次的跳躍之距離,也就是上次跳躍所畫出的半圓之「直徑」。因為是直徑,而我們等等用圓的方程式是半徑,所以將絕對值除以2,並叫做R。
而平均值即是「圓心」。因為必定在數線上,所以設座標為(H, 0)。
讀者不需對「半圓」這件事做任何處理,因為出題者(就是我)已經保證給定的點一定在圖形上,因此要擔心「半圓」的只有我XD(這題的測試資料莫名難生)
把X、Y代入平面空間(只有X、Y軸)的圓方程式:
(X - H)^ 2 + Y ^ 2 = R ^ 2
若等號左右真的成立,即代表X、Y是在這次跳躍所畫出的半圓上。
註:
這個數列叫做「Recamán」數列,參見OEIS的
A005132。關於此數列有一猜想:所有正整數(包含0)皆會出現在此數列裡。
但是即便算到了第10 ^ 230項,仍然不見852655這個數字的蹤影。
如想看一些關於這個數列的一些趣事,可以看Numberphile的
這部影片。
此外,大推Numberphile這個頻道。裡面有著各式各樣的數學小知識,有的可以跟生活連結,有的則是知道了會很酷(?。總之就是個科普頻道。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。