题意:
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
思路:这个题,用到了费马小定理 {如果p是质数,且gcd(a,p)=1,则 (mod p)},所以卡了我很久,,,
设,很容易推出。
则
可以看出a b的指数是斐波那契数列,我做的时候指数也mod 1e9+7了。。傻掉了,用费马小定理可知,指数每有1e9+6个就会变成1,所以指数是要mod 1e9+6
,求出ab的指数后,在快速幂就可以了
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define maxn 10
#define mod 1000000007
///n行m列的矩阵
struct AA
{
ll n,m,a[maxn][maxn];
void mem1()
{
memset(a,0,sizeof(a));///n=m时,初始化为单位阵
for(int i=0;i<n;i++)
a[i][i]=1;
}
};
///n行m列的aa矩阵 * m行k列的bb矩阵
AA mul(AA aa,AA bb,int n,int m,int kk)
{
AA cc;
cc.n=cc.m=2;
for(int i=0;i<n;i++)
{
for(int j=0;j<kk;j++)
{
int x=0;
for(int k=0;k<m;k++)
{
x+=(aa.a[i][k]*bb.a[k][j])%(mod-1);
x%=(mod-1);
}
cc.a[i][j]=x;
}
}
return cc;
}
///方阵aa的m次方
AA POW(AA aa,ll m)
{
AA d;d.n=d.m=2;
d.mem1();
while(m)
{
if(m&1)
{
d=mul(d,aa,2,2,2);
}
m/=2;
aa=mul(aa,aa,2,2,2);
}
return d;
}
ll pp(ll i,ll j)
{
ll zz=1;
while(j)
{
if(j&1) {zz*=i;zz%=mod;}
j/=2;
i*=i;
i%=mod;
}
return zz;
}
ll n,a,b,x,y;
int main()
{
while(~scanf("%lld%lld%lld",&a,&b,&n))
{
if(n==0)
{
printf("%lld\n",a%mod);
}
else if(n==1)
{
printf("%lld\n",b%mod);
}
else
{
AA aa,bb;aa.n=aa.m=2;
aa.a[0][0]=1;aa.a[0][1]=1;
aa.a[1][0]=1;aa.a[1][1]=0;
AA cc=POW(aa,n-1);
bb.a[0][0]=1;
bb.a[1][0]=0;
cc=mul(cc,bb,2,2,1);
printf("%lld\n",(pp(a,cc.a[1][0])*pp(b,cc.a[0][0]))%mod);
}
}
}