題目描述:給定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...