切換
舊版
前往
大廳
主題

ZeroJudge - c695: 藍燄番外篇——敗者之路(其一) 解題心得

Not In My Back Yard | 2018-09-16 11:42:12 | 巴幣 0 | 人氣 110


題目連結:
註:這題是由本人出題



題目大意:
有一數列按以下的模式生成:
在數線上從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這個頻道。裡面有著各式各樣的數學小知識,有的可以跟生活連結,有的則是知道了會很酷(?。總之就是個科普頻道。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作