切換
舊版
前往
大廳
主題

ZeroJudge - c903: 數字的挑戰 解題心得

Not In My Back Yard | 2018-12-19 12:39:59 | 巴幣 2 | 人氣 174

題目連結:


題目大意:
給定一正整數 n ( 0 ≦ n ≦ 2, 000, 000, 000 ),求(2+√3) ^ n 的整數部分之末三位。若不足三位長,請補足前導 0 。



範例輸入:
0
1
2
3
10
123456789



範例輸出:
001
003
013
051
173
451



解題思維:
關於這題有個不錯的性質:設(2 + √3) ^ n = a + b√3 (a、b ∈ ℕ ),則 (2 + √3) ^ n 之整數部分便為 2a - 1 。

以下為證明:
我們可以假設以下兩式,而一式中的 Z 即是題目想要求的整數部分
再將兩式相加,得到
而因為等號左邊為一正整數,因此右邊也為一正整數。且因 0 < c、c’ < 1,所以 c + c’ 必等於 1 ( Z 本來已經就是正整數)。於是
得證。


有了以上的背景知識後,那要怎麼快速得到 a + b√3 中的 a 呢?觀察以下關係式:
已知(2 + √3) ^ n = x+y√3
則(2 + √3) ^ (n + 1) = (2x+3y) + (x+2y)√3
轉成矩陣相乘的形式即為:

設以上的 x = 1 、 y = 0,在左邊乘一個上式最左邊的矩陣(以下稱矩陣 A )得到2 + √3);再乘一個 A ,得到 7+4√3;乘 n 個 A ,得到(2 + √3) ^ n 。

然後,再套用矩陣快速冪的概念(本人的這篇文章有提到),並在相乘的時候取 1, 000 的餘數。這樣便可快速得到(2 + √3) ^ n = a + b√3 中的 a、b 。

最後,算出 2a - 1 之後,再取 1, 000 的餘數即是所求。(注意數字的長度,可能不足三位長,這時要在前面補 0 )
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

相關創作

更多創作