快速冪(矩陣快速冪)

2021-08-05 22:21:46 字數 1418 閱讀 6770

求:3^0 + 3^1 +…+ 3^(n) mod 1000000007

input

輸入乙個數n(0 <= n <= 10^9)

output

輸出:計算結果

sample input

3sample output

40【分析】

利用等比數列的求和公式得所求和是(3(n+1)-1)/2,如果暴力求3(n+1)會超時,這裡引入快速冪來加速。

思想類似這樣,比如求38,直接求的話就是8個3相乘,可以轉換成4個9相乘,繼續轉換成2個81相乘,這樣大大縮短了計算時間。而快速冪的思想,則是把冪當成二進位制數,依次進行右移位運算,大大減少了運算次數,比如求310,此時冪是10=1010(2),規定冪模2等於1即冪&1等於1時,右移1位運算,並乘進結果,計算310其實就是拆成了38和3^2這兩個數相乘,快速冪**具體實現結合本題如下示範:

【乘法逆元問題】

滿足ak=1(mod p)的k值就是a關於p的乘法逆元。

(a/b)mod p=(ak)mod p

關於逆元的求法後續部落格會補充,本題中的k=(1e9+7+1)/2

#includeusing namespace std;

const int mod=1e9+7;

long long mul(long long x,long long n)

return result;

}int main()

return ret;

}class matrix

void _copy(int*t)

return a.d[1][1];

}int main()

超時**2:

for(int i=1;i<=k;i++)

優化方法是利用遞迴的方式解決,列舉其中兩個和,比如(e是單位陣):

s(6)=a+a2+…+a6=(a+a2+a3)(e+a3)=s(3)*(e+a3)

s(7)=a+a2+…+a7=a+(a2+a3+a4)(e+a3)=a+s(3)(a+a^4)

通過觀察這兩個有代表性的前6、7項和,可以很快寫出遞迴求解前k項和的函式,可以有效解決tle

另外,注意本題用於運算的二維陣列矩陣,如果定義成long long會tle,要定義成int

ac**:

#include#includeusing namespace std;

int mod;

typedef struct

matrix;

matrix mul(matrix a,matrix b)

return c;

}matrix add(matrix a,matrix b)

result=solve(m,k);

for(int i=0;icout<}

return 0;

}

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...

快速冪 矩陣快速冪

快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...

快速冪 矩陣快速冪

如果要你自己寫乙個pow 函式,需要求2的2000000000次方,怎麼求?int pow int a,int b 上述 的時間複雜度是o n 當資料數量級很大的時候,這份 的耗時會非常巨大,並不能解決我們的問題。那我們該怎麼辦呢?以2的74次方為例,74的二進位制為1001010。對應的,我們得到...