问题递推比较最后的形式为:
其中F(n)为斐波那契数列
先用矩阵快速幂求斐波那契数的通项F(n)与F(n-1),由于他们在指数位置上,算出来非常大,所以需要用到欧拉降幂公式,其中(mod)=mod-1,1e9+7是个素数。
最后,用快速幂把F(n)结果算出来即可
AC代码:
/*************************************************************************
> File Name: HDU4549.cpp
> Author: Xingxing
> Created Time: 2016/9/23 17:26:22
************************************************************************/
#include<iostream>
#include <cstdio>
#include <cstring>
typedef long long ll;
using namespace std;
const int mod=1000000007;
const int MOD=1000000007-1; //指数循环节
const int N=2;
ll a,b,n;
struct mat{
ll m[N][N];
mat() {}
mat unit(){
for(int i=0;i<N;i++)
for(int j=0;j<=N;j++)
m[i][j]=i==j?1:0;
}
};
mat t;
mat operator * (mat a,mat b){
mat res;
for(int i=0;i<N;i++)
for(int j=0;j<=N;j++){
res.m[i][j]=0;
for(int k=0;k<N;k++){
res.m[i][j]+=a.m[i][k]*b.m[k][j];
if(res.m[i][j]>MOD) //欧拉降幂公式
res.m[i][j]%=MOD;
}
}
return res;
}
mat operator ^ (mat res,ll n){
res.unit();
while(n>=1){
if(n&1)
res=res*t;
n=n>>1;
t=t*t;
}
return res;
}
void init(){
t.m[0][0]=1;t.m[0][1]=1;
t.m[1][0]=1;t.m[1][1]=0;
}
ll quickpow(ll a,ll b){
int res=1;
while(b>0){
if(b&1)
res=res*a%mod;
b=b>>1;
a=(a%mod)*(a%mod)%mod;
}
return res;
}
int main(){
//freopen("input.txt","r",stdin);
while(~scanf("%lld%lld%lld",&a,&b,&n)){
if(n==0){
printf("%lld\n",a);
continue;
}
else if(n==1){
printf("%lld\n",b);
continue;
}
else{
ll ans1,ans2,ans;
mat A,B;
memset(A.m,0,sizeof(A.m));
memset(B.m,0,sizeof(B.m));
init();
A=t^(n-1);
ans1=A.m[0][1];
init();
B=t^(n);
ans2=B.m[0][1];
ans=(quickpow(a,ans1)*quickpow(b,ans2))%mod;
cout<<ans<<endl;
}
}
return 0;
}