1.递归快速幂
//快速幂
long long fastpow2(long long a,int n)
{
if(n==1)return a;
long long temp=fastpow2(a,n/2);
if(n%2==1) return temp*temp*a;
else
return temp*temp;
}
2.非递归快速幂
//非递归
long long fastpow(long long a,int n)
{
long long ans=1;
while(n)
{
if(n&1) ans*=a; //如果n当前的末位为1
a*=a;
n>>=1;
}
return ans;
}
3.矩阵快速幂
(洛谷P1962) 斐波那契数列
//矩阵快速幂
#include<cstdio>
#define MOD 1000000007
typedef long long ll;
struct matrix
{
ll a1,a2,b1,b2;
matrix(ll a1,ll a2,ll b1,ll b2):a1(a1),a2(a2),b1(b1),b2(b2){}
matrix operator*(const matrix &y)
{
matrix ans((a1*y.a1+a2*y.b1)%MOD,
(a1*y.a2+a2*y.b2)%MOD,
(b1*y.a1+b2*y.b1)%MOD,
(b1*y.a2+b2*y.b2)%MOD);
return ans;
)
}
};
matrix qpow(matrix a,ll n)
{
matrix ans(1,0,0,1);//单位矩阵
while(n)
{
if(n&1)
ans=ans*a;
a*=a;
n>>=1;
}
return ans;
}
int main()
{
ll x;
matrix M(0,1,1,1);
scanf("%lld",&x);
matrix ans=qpow(M,x-1);
printf("%lld\n",(ans.a1+ans.a2)%MOD);
return 0;
}