九度OJ 1089 遞推數列

2021-07-16 05:54:56 字數 1454 閱讀 8235

題目描述:給定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。這裡n >= 2。 求第k個數對10000的模。

輸入:輸入包括5個整數:a0、a1、p、q、k。

輸出:第k個數a(k)對10000的模。

樣例輸入:

20 1 1 14 5
樣例輸出:

8359
本題用常規做法,時間複雜度為o(n),必定超時。用矩陣快速冪改進之後,時間複雜度提高到o(logn)

注意到本題的規律:

那麼,求ak,我們就可以用以下式子:

下面就是如何求矩陣[p q; 1 0]的(k-1)次冪。

矩陣快速冪的關鍵思想是利用二進位制位來減少乘積的次數。

例如:a^(101010) = a^(100000) + a^(00000)+a^(1010)+a^(000)+a^(10)+a^(0)

什麼意思呢,也就是說,求乙個a的101010次方,我們可以轉化成右邊的式子,減少乘法的次數。

結合**講:

n表示冪,res表示要求的結果,初值為1,a表示底

while(n) 

n >>= 1; //右移一位,即判斷下乙個高位

a = a * a; //每次指標向前指一位,變成原來的平方

}

分析:當指標指向末位的0,res的值不動,右移一位,基值adouble一下,變為a^2;

下一次指標指向左邊的1時,res = res * a^2,表示該位要乘進來,然後繼續下去。也就是說,如果哪位是1,將該位對應的a^? 乘進來,就是這麼回事。

本題中只要將a換成矩陣,數的運算,重新定義矩陣的乘法運算即可。還要注意前兩個數是特例,不能帶入遞推式子。

#include #include #define mod 10000

using namespace std;

typedef long long ll;

ll a0,a1,p,q,k;

typedef struct matrix

}matrix;

matrix multi(matrix x,matrix y)

result.num[i][j] = result.num[i][j] % mod;

} }return result;

}void calculation(int n)

cout>a1>>p>>q>>k){

if(k == 0)

cout<

九度OJ 1089 數字反轉

題目1089 數字反轉 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 2591 解決 1425 題目描述 12翻一下是21,34翻一下是43,12 34是46,46翻一下是64,現在又任意兩個正整數,問他們兩個數反轉的和是否等於兩個數的和的反轉。輸入 第一行乙個正整數表示測試資料的個數...

湘潭大學OJ1089質因數分解

description 任意乙個正整數可以分解成唯一的質因數的乘積,給出正整數,請計算出它的質因數分解式。輸入每行乙個正整數2 n 10 8。輸出每行輸出乙個對應結果。使用 表示冪,表示乘,質因子應該按從小到大的順序輸出,如果某乙個質因子只有一次,那麼就不要輸出它的冪。sample input26 ...

九度Oj題解

一 動態規劃專題 1205 n階樓梯上樓問題 dp i 表示到達i階的方法數,狀態轉移方程 dp i dp i 1 dp i 2 值很大要用long long.1451 不容易系列之一 dp i 表示總共i個數時的錯排方案數,狀態轉移方程 dp i i 1 dp i 1 i 2 dp i 2 142...