Mean:
給出x和M,求:(5+2√6)^(1+2x)的值。x<2^32,M<=46337.
analyse:
這題需要用到高中的數學知識點:特征根法求遞推數列通項公式。
方法是這樣的:

對于這題的解法:
記λ1=5+2√6,λ2=5-2√6,則λ1λ2=1,λ1+λ2=10
根據韋達定理可以推導出:λ1,λ2的特征方程為 x^2-10x+1=0
根據λ1=5+2√6,λ2=5-2√6是特征方程x^2-10x+1=0的解,可以求出:b=-10,c=1
再使用該特征方程反向推導出遞推公式為:a[n]=10*a[n-1]-a[n-2]
再由特征根法确定通項為:a[n]=(5+2√6)^n+(5-2√6)^n
觀察通項,發現(5-2√6)^n<1,(5+2√6)^n>1。并且可以确定(5+2√6)^n的整數部分的值為a[n]-1
到這裡,可以利用線性遞推公式a[n]=10*a[n-1]-a[n-2],構造矩陣來找循環節。
為什麼要找循環節呢?
因為n=2^x相當大,而模數M<=46337,對于每一個模數M,都存在循環節,這樣的話我們就不需要完整的計算n次幂運算了。
而且我們發現這些循環節都比較小,是以我們可以直接暴力求矩陣循環節。
Time complexity: O(N+logx)
<a href="https://github.com/crazyacking/ACM-ICPC/blob/master/HDU/HDU%205451%20Best%20Solver/main.cpp" target="_blank">view code</a>