HDU 4549 費馬定理 快速冪 矩陣快速冪

M斐波那契數列

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2286    Accepted Submission(s): 668


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
#include<cstdio> #include<cstring> #include<iostream> __int64 mod=1000000007; struct A {    __int64 mat[3][3]; }; __int64 quickp(__int64 a,__int64 n) {    __int64 aa=1;    while(n)    {        if(n&1)        aa*=a;        a*=a;        n>>=1;        aa%=mod;        a%=mod;    }    return aa; } A mat_mat(A a,A b) {    A c;    c.mat[1][1]=(a.mat[1][1]*b.mat[1][1]+a.mat[1][2]*b.mat[2][1])%(mod-1);    c.mat[1][2]=(a.mat[1][1]*b.mat[1][2]+a.mat[1][2]*b.mat[2][2])%(mod-1);    c.mat[2][1]=(a.mat[2][1]*b.mat[1][1]+a.mat[2][2]*b.mat[2][1])%(mod-1);    c.mat[2][2]=(a.mat[2][1]*b.mat[1][2]+a.mat[2][2]*b.mat[2][2])%(mod-1);    return c; }  A quickP(A a,__int64 n) {   A aa;   aa.mat[1][1]=aa.mat[2][2]=1;   aa.mat[1][2]=aa.mat[2][1]=0;   while(n)   {       if(n&1)      aa=mat_mat(aa,a);      a=mat_mat(a,a);      n>>=1;    }   return aa; } int main() { __int64 a=0,b=0,n=0; while(scanf("%I64d%I64d%I64d",&a,&b,&n)!=EOF) { A x,y; x.mat[1][1]=0; x.mat[1][2]=x.mat[2][1]=x.mat[2][2]=1; y=quickP(x,n); printf("%I64d\n",quickp(a,y.mat[1][1])*quickp(b,y.mat[1][2])%mod); } return 0; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章