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; }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章