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]的值嗎?
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 )
每組數據佔一行,包含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;
}