hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
生活随笔
收集整理的這篇文章主要介紹了
hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
M斐波那契數列
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Time Limit: 3000/1000 MS (Java/Others)????Memory Limit: 65535/32768 K (Java/Others)Problem Description M斐波那契數列F[n]是一種整數數列,它的定義如下:
F[0] = a
F[1] = b
F[n] = F[n-1] * F[n-2] ( n > 1 )
現在給出a, b, n,你能求出F[n]的值嗎?
Input 輸入包含多組測試數據;
每組數據占一行,包含3個整數a, b, n( 0 <= a, b, n <= 10^9 )
Output 對每組測試數據請輸出一個整數F[n],由于F[n]可能很大,你只需輸出F[n]對1000000007取模后的值即可,每組數據輸出一行。
Sample Input 0 1 0 6 10 2
Sample Output 0 60 分析:用普通方法提交了一次,果斷超時。 寫出F(2)、F(3)、F(4)、F(5)…會發現a和b的指數是fib數,如果求出fib數列,用快速冪就可以快速求出最后答案。問題轉化為了如何快速求解fib數列。 因為【F(n-2),F(n-1)】*【0,1,1,1】 = 【F(n-1),F(n)】,所以可以用矩陣乘法來求。 每次相乘的矩陣為? 0 ? ?1 1 ? ?1 ? ? ? ? 為了防止求F(n)時溢出,要對矩陣元素取模,即 a[i][j] ?%= 1000000006。模數之所以為1000000006是因為根據費馬小定理可得A^euler(M) = 1 (mod M),其中M為素數。 所以A^N = A^(N % euler(M))(mod M),而1000000007為素數,euler(1000000007)=?1000000006,所以模數是1000000006。 求出F(n-1)和F(n)以后,用二分快速冪求出pow(a,F(n-1))* pow(b,F(n))%?1000000007 就是最后的答案。 #include<stdio.h> #define mod 1000000007 typedef __int64 LL; struct Matrix {LL mat[2][2]; };Matrix unit_matrix = {1, 0,0, 1 }; //單位矩陣Matrix mul(Matrix a, Matrix b) //矩陣相乘 {Matrix res;for(int i = 0; i < 2; i++)for(int j = 0; j < 2; j++){res.mat[i][j] = 0;for(int k = 0; k < 2; k++){res.mat[i][j] += a.mat[i][k] * b.mat[k][j];res.mat[i][j] %= 1000000006;}}return res; }Matrix pow_matrix(Matrix a, LL n) //矩陣快速冪 {Matrix res = unit_matrix;while(n != 0){if(n & 1)res = mul(res, a);a = mul(a, a);n >>= 1;}return res; }LL pow(LL a, LL n) //二分快速冪 {a %= mod;LL res = 1;while(n != 0){if(n & 1)res = res * a % mod;a = a * a % mod;n >>= 1;}return res; }int main() {LL a, b, n;Matrix tmp;tmp.mat[0][0] = 0;tmp.mat[0][1] = tmp.mat[1][0] = tmp.mat[1][1] = 1;while(~scanf("%I64d%I64d%I64d",&a,&b,&n)){Matrix p = pow_matrix(tmp, n); //p.mat[0][0]即為F(n-1),p.mat[1][0]即為F(n)LL ans = (pow(a, p.mat[0][0]) * pow(b, p.mat[1][0])) % mod;printf("%I64d\n",ans);}return 0; }
總結
以上是生活随笔為你收集整理的hdu 4549 M斐波那契数列(费马小定理 + 二分快速幂 + 矩阵快速幂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 4556 Stern-Bro
- 下一篇: 一口气说出 6种 延时队列的实现方法,面